二叉排序树(BST)/二叉查找树的建立(BST是笔试面试的常客)
2013-06-09 19:49
316 查看
二叉排序树又叫二叉查找树,英文名称是:Binary Sort Tree. BST的定义就不详细说了,我用一句话概括:左 < 中 < 右。 根据这个原理,我们可以推断:BST的中序遍历必定是严格递增的。
在建立一个BST之前,大家可以做一下这个题目(很简单的):
已知,某树的先序遍历为:4, 2, 1 ,0, 3, 5, 9, 7, 6, 8. 中序遍历为: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9. 请画出该树。
我们知道,树的基本遍历有4种方式,分别是:
先序遍历;中序遍历;后续遍历;层次遍历。事实上,知道任意两种方式,并不能唯一地确定树的结构,但是,只要知道中序遍历和另外任意一种遍历方式,就一定可以唯一地确定一棵树,于是,上面那个题目的答案如下:
下面,我们来看看BST的建立过程,程序如下(没考虑内存泄露):
那么,怎么知道我们这个程序对不对呢?我们输出其先序和中序遍历,这样就可以完全确定这棵树,运行程序,发现先序遍历为:4, 2, 1 ,0, 3, 5, 9, 7, 6, 8. 中序遍历为: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9. 好了,这棵树确定了,如上图(已画),那棵树真的是一棵BST, 真的。在后续的博文中,我们会给出二叉排序树的判定方法,期待ing.
在建立一个BST之前,大家可以做一下这个题目(很简单的):
已知,某树的先序遍历为:4, 2, 1 ,0, 3, 5, 9, 7, 6, 8. 中序遍历为: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9. 请画出该树。
我们知道,树的基本遍历有4种方式,分别是:
先序遍历;中序遍历;后续遍历;层次遍历。事实上,知道任意两种方式,并不能唯一地确定树的结构,但是,只要知道中序遍历和另外任意一种遍历方式,就一定可以唯一地确定一棵树,于是,上面那个题目的答案如下:
下面,我们来看看BST的建立过程,程序如下(没考虑内存泄露):
#include <iostream> using namespace std; // BST的结点 typedef struct node { int key; struct node *lChild, *rChild; }Node, *BST; // 在给定的BST中插入结点,其数据域为element, 使之称为新的BST bool BSTInsert(Node * &p, int element) { if(NULL == p) // 空树 { p = new Node; p->key = element; p->lChild = p->rChild = NULL; return true; } if(element == p->key) // BST中不能有相等的值 return false; if(element < p->key) // 递归 return BSTInsert(p->lChild, element); return BSTInsert(p->rChild, element); // 递归 } // 建立BST void createBST(Node * &T, int a[], int n) { T = NULL; int i; for(i = 0; i < n; i++) { BSTInsert(T, a[i]); } } // 先序遍历 void preOrderTraverse(BST T) { if(T) { cout << T->key << " "; preOrderTraverse(T->lChild); preOrderTraverse(T->rChild); } } // 中序遍历 void inOrderTraverse(BST T) { if(T) { inOrderTraverse(T->lChild); cout << T->key << " "; inOrderTraverse(T->rChild); } } int main() { int a[10] = {4, 5, 2, 1, 0, 9, 3, 7, 6, 8}; int n = 10; BST T; // 并非所有的a[]都能构造出BST,所以,最好对createBST的返回值进行判断 createBST(T, a, n); preOrderTraverse(T); cout << endl; inOrderTraverse(T); cout << endl; return 0; }
那么,怎么知道我们这个程序对不对呢?我们输出其先序和中序遍历,这样就可以完全确定这棵树,运行程序,发现先序遍历为:4, 2, 1 ,0, 3, 5, 9, 7, 6, 8. 中序遍历为: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9. 好了,这棵树确定了,如上图(已画),那棵树真的是一棵BST, 真的。在后续的博文中,我们会给出二叉排序树的判定方法,期待ing.
相关文章推荐
- 二叉排序树(BST)/二叉查找树的建立(BST是笔试面试的常客)
- 二叉查找树/二叉排序树/二叉搜索树----> BST
- C++ 二叉排序树BST(二叉查找树)
- BST(Binary Search Tree,二叉查找树,二叉排序树)c的实现(部分函数不知如何调用)
- 二叉排序树(二叉查找树)BST构造,节点插入,节点查找,节点删除(java)
- 二叉树是笔试面试中考试最频繁的数据结构之一,主要包括,程序建立一个二叉树,三种次序遍历二叉树,返回叶子节点的数目,求二叉树节点的总数等。建立一个二叉树节点的数据结构
- <笔试><面试>C/C++单链表(最综合)最全工程从建立到相关函数实现
- 二叉排序树(或二叉查找树)的建立
- 二叉排序树(BST)的建立
- 二叉排序树的建立和查找(面试常考)
- 为什么tcp建立连接是三次握手而不是两次握手或者四次握手?(笔试面试常考)
- 递归建立二叉查找树(BST)以及递归求树的高度
- 【C++研发面试笔记】9. 基本数据结构-二叉查找树BST
- 从抓包的角度来分析tcp建立时的三次握手(好几次笔试面试,都有tcp三次握手)
- 二叉搜索树;二叉查找树;二叉排序树;binary search tree(BST)
- 面试题目:有序数组建立二叉排序树
- 二叉查找树(二叉排序树)的详细实现(BST)
- 二叉搜索树(二叉排序树,二叉查找树)BST
- <笔试><面试>C/C++单链表(最综合)最全工程从建立到相关函数实现
- BST二叉排序树的建立以及应用