CLRS 12.4随机构建二叉搜索树
来源:互联网 发布:淘宝搜索页广告位价格 编辑:程序博客网 时间:2024/06/09 14:08
12.4-1
证明前先需要知道有
先证明附录 C 的练习 C.1-7
然后有:
12.4-2
首先给出第二个问题的答案,即渐进上界
下面给出一个例子,
对此例的平均深度证明是
12.4-3
先给出
从左到右依次编号为
因此图3被创建的概率是
12.4-4
在书的附录里面有凸函数的定义(见中文版第三版的P701或英文版的P1199),然后国外的语意和国内相反,所以我们是要证明
证明:根据凹函数定义:对于任意
这里有个重要不等式,即对于任意
这样用
带入并化解得:
把②和③式带入①式得:
由于
12.4-5
略。
附上本章的一些实现代码
#include <iostream>#include <stack>using std::cout;using std::endl;using std::stack;struct BinTree{ int key; BinTree *parent; BinTree *left; BinTree *right;};void preOrder(BinTree *root){ if(root != NULL) { cout << root->key << ' '; preOrder(root->left); preOrder(root->right); }}void non_recursive_preOrder(BinTree *root){ stack<BinTree *> ptr; ptr.push(root); while(root != NULL && !ptr.empty()) { BinTree *p = ptr.top(); cout << p->key << ' '; ptr.pop(); if(p->right != NULL) ptr.push(p->right); if(p->left != NULL) ptr.push(p->left); }}void inOrder(BinTree *root){ if(root != NULL) { inOrder(root->left); cout << root->key << ' '; inOrder(root->right); }}void non_recursive_inOrder(BinTree *root){ stack<BinTree *> ptr; BinTree *p = root; while(p != NULL || !ptr.empty()) { while(p != NULL) //找到最左孩子 { ptr.push(p); p = p->left; } if(!ptr.empty()) //弹出,然后向右 { p = ptr.top(); ptr.pop(); cout << p->key << ' '; p = p->right; } }}void postOrder(BinTree *root){ if(root != NULL) { postOrder(root->left); postOrder(root->right); cout << root->key << ' '; }}void non_recursive_postOrder(BinTree *root){ stack<BinTree *> ptr; BinTree *cur; BinTree *pre = NULL; ptr.push(root); while(!ptr.empty()) { cur = ptr.top(); //当前结点没孩子或者左(右)孩子已经访问过,则访问当前结点 if(cur->left == NULL && cur->right == NULL || pre != NULL && (pre == cur->left || pre == cur->right)) { cout << cur->key << ' '; ptr.pop(); pre = cur; } else { if(cur->right != NULL) ptr.push(cur->right); if(cur->left != NULL) ptr.push(cur->left); } }}BinTree *TREE_SEARCH(BinTree *root,int value){ if(root == NULL) return root; if(root->key == value) return root; if(root->key < value) TREE_SEARCH(root->right,value); else TREE_SEARCH(root->left,value);}BinTree *non_recursive_TREE_SEARCH(BinTree *root,int value){ while(root != NULL && root->key != value) { if(root->key < value) root = root->right; else root = root->left; } return root;}BinTree *TREE_MINIMUM(BinTree *root){ if(root == NULL) return root; if(root->left == NULL) return root; else return TREE_MINIMUM(root->left);}BinTree *non_recursive_TREE_MINIMUM(BinTree *root){ if(root == NULL) return root; while(root->left != NULL) root = root->left; return root;}BinTree *TREE_MAXIMUM(BinTree *root){ if(root == NULL) return root; if(root->right == NULL) return root; else return TREE_MAXIMUM(root->right);}BinTree *non_recursive_TREE_MAXIMUM(BinTree *root){ if(root == NULL) return root; while(root->right != NULL) root = root->right; return root;}BinTree *TREE_SUCCESSOR(BinTree *p){ if(p == NULL) return p; if(p->right != NULL) return TREE_MINIMUM(p->right); BinTree *x = p->parent; while(x != NULL && p == x->right) { p = x; x = x->parent; } return x;}BinTree *TREE_PREDECESSOR(BinTree *p){ if(p == NULL) return p; if(p->left != NULL) return TREE_MAXIMUM(p->left); BinTree *x = p->parent; while(x != NULL && p == x->left) { p = x; x = x->parent; } return x;}void TREE_INSERT(BinTree **root,int key){ if(*root == NULL) //插入根节点 { BinTree *z = new BinTree; z->key = key; z->left = z->right = NULL; *root = z; z->parent = NULL; return; } BinTree *x = *root; if(x->key > key) //左子树 { if(x->left == NULL) //左子树为空 { BinTree *z = new BinTree; z->key = key; z->left = z->right = NULL; z->parent = x; x->left = z; } else TREE_INSERT(&(x->left),key);//以左子树为根递归插入 } else //右子树 { if(x->right == NULL) { BinTree *z = new BinTree; z->key = key; z->left = z->right = NULL; z->parent = x; x->right = z; } else TREE_INSERT(&(x->right),key); }}void non_recursive_TREE_INSERT(BinTree **root,int key){ BinTree *z = new BinTree; z->key = key; z->left = z->right = NULL; BinTree *y = NULL; BinTree *x = *root; while(x != NULL) { y = x; if(x->key < z->key) x = x->right; else x = x->left; } z->parent = y; if(y == NULL) *root = z; else if(y->key < z->key) y->right = z; else y->left = z;}void TRANSPLANT(BinTree **root,BinTree *u,BinTree *v){ if(u->parent == NULL) *root = v; else if(u == u->parent->left) u->parent->left = v; else u->parent->right = v; if(v != NULL) v->parent = u->parent;}void TREE_DELETE(BinTree **root,int key){ BinTree *p = TREE_SEARCH(*root,key); if(p == NULL) return; if(p->left == NULL) TRANSPLANT(root,p,p->right); else if(p->right == NULL) TRANSPLANT(root,p,p->left); else{ BinTree *y = TREE_MINIMUM(p->right); if(y->parent != p) { TRANSPLANT(root,y,y->right); y->right = p->right; y->right->parent = y; } TRANSPLANT(root,p,y); y->left = p->left; y->left->parent = y; } delete p;}int main(){ BinTree *root = NULL; int array[] = {8,2,-5,1,77,-6,45,0,5}; for(int i = 0; i < 5; ++i) TREE_INSERT(&root,array[i]); //创建树 for(int i = 5; i < 9; ++i) non_recursive_TREE_INSERT(&root,array[i]); //接上继续创建,在这只是为了测试 //分别用先中后序输出,包括每种顺序的递归和非递归 cout << "preOrder: "; preOrder(root); cout << endl; cout << "non recursive preOrder: " ; non_recursive_preOrder(root); cout << endl; cout << "inOrder: " ; inOrder(root); cout << endl; cout << "non recursive inOrder: "; non_recursive_inOrder(root); cout << endl; cout << "postOrder: "; postOrder(root); cout << endl; cout << "non recursive postOrder: "; non_recursive_postOrder(root); cout << endl; //查找元素,找到则输出并找到该元素的前驱和后继 BinTree *p = TREE_SEARCH(root,77); if(p != NULL){ cout << "find " << p->key << endl; cout << "it's predecessor and successor: "; BinTree *pre = TREE_PREDECESSOR(p); if(pre != NULL) cout << pre->key << ' '; else cout << "NULL" << ' '; BinTree *succ = TREE_SUCCESSOR(p); if(succ != NULL) cout << succ->key << ' '; else cout << "NULL" << ' '; cout << endl; } else cout << "can not find in the tree" << endl; p = TREE_SEARCH(root,66); if(p != NULL){ cout << "find " << p->key << endl; cout << "it's predecessor and successor: "; BinTree *pre = TREE_PREDECESSOR(p); if(pre != NULL) cout << pre->key << ' '; else cout << "NULL" << ' '; BinTree *succ = TREE_SUCCESSOR(p); if(succ != NULL) cout << succ->key << ' '; else cout << "NULL" << ' '; cout << endl; } else cout << "can not find in the tree" << endl; p = TREE_SEARCH(root,8); if(p != NULL){ cout << "find " << p->key << endl; cout << "it's predecessor and successor: "; BinTree *pre = TREE_PREDECESSOR(p); if(pre != NULL) cout << pre->key << ' '; else cout << "NULL" << ' '; BinTree *succ = TREE_SUCCESSOR(p); if(succ != NULL) cout << succ->key << ' '; else cout << "NULL" << ' '; cout << endl; } else cout << "can not find in the tree" << endl; //找到树的最小和最大值 p = TREE_MINIMUM(root); if(p != NULL) cout << "minimum is: " << p->key << endl; p = TREE_MAXIMUM(root); if(p != NULL) cout << "maximum is: " << p->key << endl; //删除操作 TREE_DELETE(&root,8); p = TREE_SEARCH(root,8); if(p != NULL){ cout << "find " << p->key << endl; cout << "it's predecessor and successor: "; BinTree *pre = TREE_PREDECESSOR(p); if(pre != NULL) cout << pre->key << ' '; else cout << "NULL" << ' '; BinTree *succ = TREE_SUCCESSOR(p); if(succ != NULL) cout << succ->key << ' '; else cout << "NULL" << ' '; cout << endl; } else cout << "can not find in the tree" << endl; //删除后中序遍历 inOrder(root); cout << endl; return 0;}
- CLRS 12.4随机构建二叉搜索树
- 算法导论12.4随机构建二叉搜索树 练习总结
- CLRS 12.1什么是二叉搜索树
- CLRS 12.2查询二叉搜索树
- CLRS 15.5最优二叉搜索树
- 随机二叉搜索树 Treap
- HDU3791 二叉搜索树(构建二叉搜索树模板)
- CLRS 5.3随机算法
- 随机自平衡二叉搜索树Treap模版
- 随机化的二叉搜索树总结(treap,随机输入)
- 二叉搜索树的构建与判别--是否为同一棵二叉搜索树
- 重现二叉搜索树递归构建的过程
- (p169)构建二叉搜索树和进行相应的操作
- 二叉搜索树的构建,遍历,查找,删除
- LeetCode 654 Maximum Binary Tree(构建二叉搜索树)
- BinaryTree的构建和遍历,以及搜索删除(非完全二叉树,非平衡二叉树)
- 九度 题目1009:二叉搜索树 (静态数组构建二叉树\二叉树的数组实现)
- 算法导论-第12章-二叉搜索树:随机二叉搜索树数据结构C++实现(前中后序遍历,插入,搜索,前后毗邻元素,最大最小值)
- hdoj1863畅通工程<最小生成树>
- Liblinear Visual studio 2013 Error C3057
- (2016年1月4日)手机qq内置浏览器在iframe中a标签的坑
- hdoj1213How Many Tables
- 致2016开年
- CLRS 12.4随机构建二叉搜索树
- 结构体的封装转换作用
- html5创建对象的三种方式
- TCP协议中的三次握手和四次挥手(图解)
- hdoj1232畅通工程
- STL编程题1(C++程序设计第8周)
- hdoj1597find the nth digit
- 2016/01/04本周工作计划
- Apache Karaf开启ssl Https