BST(Binary Search Tree 二叉查找树模版)
2013-05-09 19:47
585 查看
/****************************************** 数据结构: BST(Binary Search Tree),二叉查找树; 性质: 若结点的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若结点的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 该结点的左、右子树也分别为二叉查找树; 遍历: 对于一个已知的二叉查找树,从小到大输出其节点的值; 只需对其进行二叉树的中序遍历即可; 即递归地先输出其左子树,再输出其本身,然后输出其右子树; 遍历的时间复杂度为O(n); 查找: 对于一个已知的二叉查找树x; 在其中查找特定的值k,函数Search返回指向值为k的节点指针; 若找不到则返回0,算法时间复杂度为O(h),h为树的高度; 理想情况下时间复杂度为lgn; 最大值和最小值: 要查找二叉查找树中具有最小值的元素; 只要从根节点开始,沿着左子树找到最左边的节点就可以了; 反之沿着右子树查找则可以求最大值; 插入: 从根节点开始插入; 如果要插入的值小于等于当前节点的值,在当前节点的左子树中插入; 如果要插入的值大于当前节点的值,在当前节点的右子树中插入; 如果当前节点为空节点,在此建立新的节点,该节点的值为要插入的值,左右子树为空,插入成功; 删除: 如果该没有子女,直接删除; 如果该结点只有一个子女,则删除它,将其子女的父亲改为它的父亲; 如果该结点有两个子女,先用其后继替换该节点,其后继的数据一并加在其后; *******************************************/ #include<iostream> #include<cstring> #include<cstdlib> #include<cstdio> #include<climits> #include<algorithm> using namespace std; const int N = 100000; int key , l , r , p ; int u, node; int Search(int x, int k)//查询 { if(x == 0 || k == key[x]) return x; if(k < key[x]) return Search(l[x], k); else return Search(r[x], k); } int Iterative_Search(int x, int k)//非递归版本的查询 { while(x != 0 && k != key[x]) if(k < key[x]) x = l[x]; else x = r[x]; return x; } int Minimum(int x) { while(l[x] != 0) x = l[x]; return x; } int Maximum(int x) { while(r[x] != 0) x = r[x]; return x; } int Successor(int x) { if(r[x] != 0) return Minimum(r[x]); int y = p[x]; while(y != 0 && x == r[y]) { x = y; y = p[y]; } return y; } int Predecessor(int x) { if(l[x] != 0) return Maximum(l[x]); int y = p[x]; while(y != 0 && x == l[y]) { x = y; y = p[y]; } return y; } void Insert(int &T, int v)//插入结点 { if(T == 0) key[T = ++node] = v; else if(v <= key[T]) { p[l[T]] = T; Insert(l[T], v); } else { p[r[T]] = T; Insert(r[T], v); } } void Iterative_Insert(int T, int v)//非递归版本插入结点 { int y = 0; int x = T; int z = ++node; key[z] = v; while(x != 0) { y = x; if(key[z] < key[x]) x = l[x]; else x = r[x]; } p[z] = y; if(y == 0) key[T] = z; else if(key[z] < key[y]) l[y] = z; else r[y] = z; } void Transplant(int T, int u, int v)//移植过程; //把一棵子树u归并到另一棵子树v中,u的父亲变为v的父亲,u的父亲就有了v作为其孩子。 { if(p[u] == 0) T = v; else if(u == l[p[u]]) l[p[u]] = v; else r[p[u]] = v; if(v != 0) p[v] = p[u]; } void Delete(int T, int z)//删除结点 { if(l[z] == 0) Transplant(T, z, r[z]); else if(r[z] == 0) Transplant(T, z, l[z]); else { int y = Minimum(r[z]); if(p[y] != z) { Transplant(T, y, r[y]); r[y] = r[z]; p[r[y]] = y; } Transplant(T, z, y); l[y] = l[z]; p[l[y]] = y; } } int main() { int n; scanf("%d",&n); for(int i=0; i<n; i++) { int k; scanf("%d",&k); Insert(u, k); } Delete(u, Search(u, 1)); printf("%d\n",Search(u,2)); printf("%d\n",Maximum(u)); return 0; }
相关文章推荐
- 二叉搜索树;二叉查找树;二叉排序树;binary search tree(BST)
- BST(Binary Search Tree,二叉查找树,二叉排序树)c的实现(部分函数不知如何调用)
- 二叉查找树(binary search tree (BST))--算法导论示例
- 二叉查找树(binary search tree (BST))--算法导论示例
- 【二叉查找树】04根据升序数组构造二叉查找树【Convert Sorted Array to Binary Search Tree】
- leetcode99---Recover Binary Search Tree(morris中序遍历恢复BST)
- (Leetcode 99) Recover Binary Search Tree(恢复二叉排序树BST)
- Lowest Common Ancestor of a Binary Search Tree 递归寻找二叉查找树公共祖先
- java数据结构——BinarySearchTree(二叉查找树)
- 【二叉查找树】05根据升序的链表构造二叉查找树【Convert Sorted List to Binary Search Tree】
- Convert Sorted Array to Binary Search Tree 把一个有序数组转换成BST @LeetCode
- 【数据结构与算法基础】二叉查找树 / Binary Search Tree
- **[Lintcode]Validate Binary Search Tree 验证二叉查找树
- UVA 1264 - Binary Search Tree(BST+计数)
- lintcode 容易题:Insert Node in a Binary Search Tree 在二叉查找树中插入节点
- 108. Convert Sorted Array to Binary Search Tree(和把一个单链表转换成BST树的思想一致)
- Tree_Graph Inorder Successor in Binary Search Tree BST中找中序遍历的后继节点 @CareerCup
- 【算法导论学习-24】二叉树专题2:二叉搜索树(Binary Search Tree,BST)
- LeetCode题库解答与分析——#95. 不同的二叉查找树 IIUniqueBinarySearchTreeII
- 二叉查找树的原理与实现 Binary Search Tree