二叉搜索树及其C++实现
来源:互联网 发布:hadoop和云计算知乎 编辑:程序博客网 时间:2024/06/14 16:10
一棵二叉搜索树由一棵二叉树来组织,可以用链表数据结构来表示,每个结点除了Key和卫星数据,还包含指针left,right,p,分别指向左子树,右子树和双亲。
二叉树中的key总是满足二叉搜索树性质:
设x是二叉搜索树的一个结点,若y是x左子树中的一个结点,则y.key< x.key;若y是x右子树中的一个结点,则y.key>=x.key。(相等时,放在左子树还是右子树看个人习惯,此文是放在右子树中)
#include<iostream>using namespace std;//template<class A>struct BSTNode{ //A value;//卫星数据 int key;//排序关键字 BSTNode *lchild = nullptr;//指向左孩子 BSTNode *rchild = nullptr;//指向右孩子 BSTNode *p = nullptr;//指向双亲};struct Tree{ BSTNode *root = nullptr;};//中序遍历,先序遍历,后序遍历,O(n)void inorder_tree_walk(BSTNode *x){ if(x != nullptr){ inorder_tree_walk(x->lchild); cout << x->key<<" "; inorder_tree_walk(x->rchild); }}void preorder_tree_walk(BSTNode *x){ if(x != nullptr){ cout << x->key <<" "; preorder_tree_walk(x->lchild); preorder_tree_walk(x->rchild); }}void postorder_tree_walk(const BSTNode *x){ if(x != nullptr){ postorder_tree_walk(x->lchild); postorder_tree_walk(x->rchild); cout << x->key <<" "; }}//迭代查找BSTNode* iterative_tree_search(BSTNode *x,int v){ while(x !=nullptr && x->key != v){ if(v < x->key) x = x->lchild; else x = x->rchild; } return x;}//递归查找BSTNode* tree_search(BSTNode *x,int v){ if(x == nullptr || x->key == v) return x; if(v < x->key) return tree_search(x->lchild,v); else return tree_search(x->rchild,v);}//最小关键字元素BSTNode* tree_minimum(BSTNode *x){ while(x->lchild != nullptr) x = x->lchild; return x;}//最大关键字元素BSTNode* tree_maximum(BSTNode *x){ while(x->rchild != nullptr) x = x->rchild; return x;}//后继,前驱,O(h)BSTNode* tree_successor(BSTNode *x){ if(x->rchild != nullptr) return tree_minimum(x->rchild); BSTNode *y = x->p; while(y != nullptr && x == y->rchild){ x = y; y = y->p; } return y;}BSTNode* tree_predecessor(BSTNode *x){ if(x->lchild != nullptr) return tree_minimum(x->rchild); BSTNode *y = x->p; while(y != nullptr && x == y->lchild){ x = y; y = y->p; } return y;}//插入void tree_insert(Tree &T,BSTNode *z){ BSTNode *y = nullptr; BSTNode *x = T.root; while(x != nullptr){ y = x; if(z->key < x->key) x = x->lchild; else x = x->rchild; } z->p = y; if(y == nullptr) T.root = z; else if(z->key < y->key) y->lchild = z; else y->rchild = z;}/*删除*///将v的双亲换成u的双亲void transplant(Tree &T,BSTNode *u,BSTNode *v){ if(u->p == nullptr) T.root = v; else if(u == u->p->lchild) u->p->lchild = v; else u->p->rchild = v; if(v != nullptr) v->p = u->p;}void tree_delete(Tree &T,BSTNode *z){ if(z->lchild == nullptr) transplant(T,z,z->rchild); else if(z->rchild == nullptr) transplant(T,z,z->lchild); else{ BSTNode *y = tree_minimum(z->rchild); if(y->p != z){ transplant(T,y,y->rchild); y->rchild = z->rchild; y->rchild->p = y; } transplant(T,z,y); y->lchild = z->lchild; y->lchild->p = y; }}//测试代码int main(){ Tree T; int k,n; cout<<"个数:"; cin>>n; while(n--){//输入#结束 cin>>k; BSTNode *a = new BSTNode(); a->key = k; tree_insert(T,a); } cout<<"中序输出:"; inorder_tree_walk(T.root);//输出 BSTNode *median; cout<<"\n输入要删除的节点:"; int v; cin>>v; median = iterative_tree_search(T.root,v);//查找key==8的节点 cout<<v<<"的后继"<<tree_successor(median)->key<<endl; cout<<v<<"的前驱"<<tree_predecessor(median)->key<<endl; cout<<"删除"<<v<<"得到:"; tree_delete(T,median);//,然后删除该节点 inorder_tree_walk(T.root);//输出 median = tree_minimum(T.root); cout<<"\nmininum:"<<median->key<<endl; cout<<"删除最小值得到:"; tree_delete(T,median); inorder_tree_walk(T.root);//输出 median = tree_maximum(T.root); cout<<"\nmaxinum:"<<median->key<<endl; cout<<"删除最大值得到:"; tree_delete(T,median); inorder_tree_walk(T.root);//输出 cout<<endl;}
0 0
- 二叉搜索树及其C++实现
- 二叉搜索树及其模拟实现
- [C++] 实现二叉搜索树
- 二叉搜索树(二叉查找树、二叉排序树)及其实现
- 二叉搜索树 c 语言实现
- 二叉搜索树 C语言实现
- 【C基础】二叉搜索树的实现
- 二叉搜索树(c实现)
- 【C++】实现的二叉搜索树BST
- c语言实现:二叉搜索树
- 二叉搜索树及其方法的java实现
- c语言二叉树和二叉搜索树的实现
- 二叉树及其实现
- 二叉搜索树(c++)
- 二叉搜索树实现文件C语言(BinarySearchTree.c)
- 二叉搜索树实现
- 搜索二叉树实现
- 搜索二叉树实现
- Redis客户端之Spring整合Jedis
- 常用的服务器操作命令
- CSS性能优化
- 如何将文件夹打成jar包
- C# 串口操作系列(4) -- 协议篇,文本协议数据解析
- 二叉搜索树及其C++实现
- jQuery LigerUI 插件介绍及使用之ligerTree
- 常常困扰C语言初学者的几个问题
- [shell] getopts使用
- codeforces爆做
- 《Motion Design for iOS》(二十八)
- 你见过工资高的程序员炫富 来7拍一下
- Android自动滚动 轮播循环的ViewPager
- TQ2440 PWM驱动程序设计(内核2.6.30.4)