二叉搜索树(Binary Search Tree)
2015-10-30 20:37
281 查看
1.定义
二叉查找树(Binary Search Tree)或者是一棵空树,或者是具有下列性质 的二叉树:若它的左子树不空,则左子树上所有结点的值均小于它的根结点 的值;
若它的右子树不空,则右子树上所有结点的值均大于它的根结点 的值;
它的左、右子树也分别为二叉查找树。
2.操作
1. 插入:
过程如下:从根节点开始插入;
如果要插入的值小于等于当前节点的值,在当前节点的左子树中插入;
如果要插入的值大于当前节点的值,在当前节点的右子树中插入;
如果当前节点为空节点,在此建立新的节点,该节点的值为要插入的值,左右子树为空, 插入成功
2. 删除
分为以下几种情况考虑:该节点是叶节点(没有非空子节点的 节点),直接把节点删除即可。
该节点是链节点(只有一个非空子节 点的节点),为了删除这个节点而不影响它的 子树,需要把它的子节点代替它的位置
该节点有两个非空子节点。由于情况比较复杂,一般的策略是用它右子树的最小值 来代替它,然后把它删除。
3. 查找
过程如下:从根节点开始查找;
如果当前节点的值就是要查找的值,查找成功;
如果要查找的值小于当前节点的值,在当前节点的左子树中查找该值
如果要查找的值大于当前节点的值,在当前节点的右子树中查找该值
如果当前节点为空节点,查找失败,二叉查找树中没有要查找的值
4. 遍历
二叉查找树的中序遍历为一个递增的序列。3. Code
struct BST_Node { BST_Node *l,*r; int value; BST_Node() { l=NULL; r=NULL; } }; struct BST { BST_Node *root; void Insert(BST_Node *&p,int val) { if(p==NULL) { p = new BST_Node; p->value=val; } else if(p->value>=val) { Insert(p->l,val); } else Insert(p->r,val); } int find_DeleteMin(BST_Node *&p) { if(!p->l) { BST_Node *tmp = p; int val = p->value; p=p->r; delete tmp; return val; } else return find_DeleteMin(p->l); } void Delete(BST_Node *&p,int val) { if(!p) return; if(p->value==val) { if(p->l&&p->r) { p->value=find_DeleteMin(p->r); } else { BST_Node *tmp = p; if(p->l) p=p->l; else p=p->r; delete tmp; } } if(val < p->value) Delete(p->l,val); else Delete(p->r,val); } BST_Node *Find(BST_Node *p,int val) { if(!p) return NULL; if(p->value==val) return p; else if(p->value>val) return Find(p->l,val); else return Find(p->r,val); } void midordervisit(BST_Node *p) { if(p) { midordervisit(p->l); printf("%d\n",p->value); midordervisit(p->r); } } } T;
4.拓展问题
1. 描述
有一颗树本来是一棵二叉搜索树,但是其有两个节点出错了,将这两个节点交换那么就恢复成了一棵二叉搜索树,求出这两个节点。2. 分析
二叉搜索树的中序遍历是一个递增的序列,我们假设一棵二叉搜索树的中序遍历为:(1,2,3,4,5)那么如果有两个节点出错了,就会有这两种情况(1,3,2,4,5),(1,4,3,2,5),我们设cnt表示节点pre与节点now相邻,并且pre在now的前面而且pre的值大于now的值的个数,很明显cnt只能为1,2,然后我们根据这个来考虑就可以了。
相关文章推荐
- AVL树-自平衡二叉查找树(Java实现)
- C语言二叉树的非递归遍历实例分析
- 使用C语言构建基本的二叉树数据结构
- C++非递归队列实现二叉树的广度优先遍历
- C#使用前序遍历、中序遍历和后序遍历打印二叉树的方法
- C#非递归先序遍历二叉树实例
- C++非递归建立二叉树实例
- C语言实现找出二叉树中某个值的所有路径的方法
- C++实现二叉树遍历序列的求解方法
- C语言实现二叉树遍历的迭代算法
- C#创建二叉搜索树的方法
- 用C语言判断一个二叉树是否为另一个的子结构
- C++实现二叉树非递归遍历方法实例总结
- C++二叉树结构的建立与基本操作
- 深入遍历二叉树的各种操作详解(非递归遍历)
- JavaScript数据结构和算法之二叉树详解
- java使用归并删除法删除二叉树中节点的方法
- Java中二叉树数据结构的实现示例
- python数据结构之二叉树的建立实例
- python数据结构树和二叉树简介