二叉树的查找、二叉树高度、二叉树获得双亲结点、构造二叉树、二叉树的广义表表示法、二叉树的插入删除、二叉树的非递归实现
来源:互联网 发布:淘宝代付可以用花呗吗 编辑:程序博客网 时间:2024/05/17 03:43
二叉树的查找:
#include<iostream>#include"DoubleNode.h" //双链表结点类#include"SeqStack.h" //顺序栈#include"LinkedStack.h" //链式栈#include"SeqQueue.h" //顺序循环队列using namespace std;template <class T>class BinaryTree // 二叉树类{public:DoubleNode<T> *root; //指向根结点BinaryTree(); //构造空二叉树BinaryTree(T prelist [],int n); //标明空子树的先根序列构造一棵二叉树BinaryTree(T prelist [],T inlist [],int n); //先根和中根序列构造二叉树~BinaryTree();bool IsEmpty(); //判断是否是空二叉树int Count(); //返回结点个数int Height(); //返回二叉树的高度DoubleNode<T> *Search(T value); //查找首次出现值为value的结点DoubleNode<T> *GetParent(DoubleNode<T> *node); //返回node结点的双亲结点void preRoot(); //先根次序遍历二叉树void midRoot(); //中根次序遍历二叉树void postRoot(); //后根次序遍历二叉树DoubleNode<T> *Insert(DoubleNode<T> *p, T value,bool priorChild = true);//插入value作为P结点的孩子void Remove(DoubleNode<T> * p,bool priorChild = true); //删除p结点的左或右子树void PrintGList(); //以广义表输出二叉树void preRootTraverse(); // 先根次序遍历二叉树的非递归算法void midRootTraverse(); // 中根次序遍历二叉树的非递归算法void LevelOrder(); //按层次遍历二叉树private:void Destroy (DoubleNode<T> *p); //撤销二叉树int Count(DoubleNode<T> *p); //返回以P结点为根的子树结点个数int Height(DoubleNode<T> *p); //返回以P结点为根的子树结点的高度DoubleNode<T>*Search (DoubleNode<T> *p, T value); //在以p为根的子树中查找首次出现的值为value的结点DoublenNode<T> *GetParent (DoubleNode<T> *p, DoubleNode<T> *node); // p为根的子树中查找并返回首次出现的值为value的结点void preRoot(DoubleNode<T> *p); //先跟次序遍历以p结点为根的子树void midtRoot(DoubleNode<T> *p); //中根次序遍历以p结点为根的子树void postRoot(DoubleNode<T> *p); //后根次序遍历以P结点为根的子树DoubleNode<T> *creat(T prelist[],int n,int &i); //以标明空子树的先根遍历序列创建子树DoubleNode<T> *creat(T prelist[],T inlist[],int preStart, int inStart,int n); //以先根和中根序列创建一棵子树void PrintGList (DoubleNode<T> *p); //以广义表表示输出以p结点为根的子树};template <class T>BinaryTree<T>::BinaryTree() //构造空二叉树{ this->root =NULL;}template<class T>BinaryTree<T>::~BinaryTree(){ cout<<"撤销二叉树:"; Destroy(this->root); cout<<endl;}template<class T>void BinaryTree<T>::Destroy(DoubleNode<T> *p){ if(p!=NULL) { Destroy (p->prior); Destroy (p->next); cout<<p->data<<" "; // 显示撤销结点的次序 delete p; }}template<class T>bool BinaryTree<T>::IsEmpty(){ return this->root==NULL;}template <class T>int BinaryTree<T>::Count(){ return Count(this->root);}template<class T>int BinaryTree<T>::Count(DoubleNode<T> *p){ if(p==NULL) return 0; else return 1+Count(p->prior)+Count(p->next);}template <class T>void BinaryTree<T>::preRoot(){ cout<<"先根次序遍历二叉树"; preRoot(this->root); cout<<endl;}template<class T>void BinaryTree<T>::preRoot(DoubleNode<T> *p){ if(p!=NULL) { cout<<p->data<<" ";preRoot(p->prior);preRoot(p->next); }}template <class T>void BinaryTree<T>::midRoot(){ cout<<"中根次序遍历二叉树"; midRoot(this->root); cout<<endl;}template<class T>void BinaryTree<T>::midtRoot(DoubleNode<T> *p){ if(p!=NULL) { midRoot(p->prior); cout<<p->data<<" "; midRoot(p->next); }}template<class T>void BinaryTree<T>::postRoot(){ cout<<"后根次序遍历二叉树"; postRoot(this->root); cout<<endl;}template<class T>void BinaryTree<T>::postRoot(DoubleNode<T> *p){ if(p!=NULL) { postRoot(p->prior); postRoot(p->next); cout<<p->data<<" "; }}
计算二叉树高度:
二叉树的高是一棵较高的一棵子树的高度加1,因此计算二叉树高度必须采用后根次序遍历,首先分别计算出左右子树高度,再计算当前结点为根的子树的高度
template <class T>int BinaryTree<T> ::Height()//返回二叉树的高度{return Height(this->root);}template<class T>int BinaryTree<T>::Height(DoubleNode<T> *p){ if(p!=NULL){ int lh = Height(p->prior); int rh = Height(p->next); return (lh>=rh)?lh+1:rh+1;}return 0;}
查找:
template <class T>DoubleNode<T> *BinaryTree<T>::Search(T value){ return BinaryTree(this->root,value);}template <class T>DoubleNode <T> *BinaryTree<T>::Search(DoubleNode<T> *p, T value) //先根次序遍历查找值为value的结点,返回首次出现结点的指针,若未找到返回NULL{ DoubleNode<T> *find = NULL;if(p!=NULL){ if(p->data == value)return p;find = Search(p->prior,value);if(find == NULL)find = Search(p->next,value);}return find;}
二叉树的双亲结点:
template<class T>DoubleNode<T> *BinaryTree<T>::GetParent(DoubleNode<T> *node){if(this->root == NULL||node==NULL||node==this->root)return NULL;return GetParent(this->root,node);}template<class T>DoubleNode<T> * BinaryTree<T>::GetParent(DoubleNode<T> *p, DoubleNode<T> *node){ DoubleNode<T> *find =NULL; if(p!=NULL) { if(p->prior == node|| p->next == node) return p; find = GetParent(p->prior,node); if(find ==NULL) find =GetParent(p->next,node); } return find;}
构造二叉树:
template <class T>BinaryTree<T>::BinaryTree(T prelist[], T inlist[], int n){ this->root = creat(parlist,inlist,0,0,n);}template <class T>DoubleNode<T> *BinaryTree<T>::creat(T prelist[], T inlist[], int preStart, int inStart, int n) //以先根和中根序列创建一颗子树,子树根结点是prelist[i],返回根结点指{ DoubleNode<T> *p = NULL; if(n>0) { T elem = prelist[preStart]; //根结点值 p = new DoubleNode<T> (elem); //创建结点 int i= 0; while(i<n && elem !=inlist[inStart+i]) //在中根序列中查找根值所在的位置 i++; p->prior = create(prelist,inlist,preStart+1,inStart,i) //创建左子树 p->next = create(prelist,inlist,preStart+i+1,inStart+i+1,n-1-i); //创建右子树 } return p;}template <class T>BinaryTre<T>::BinaryTree(T prelist [],int n) //标明空子树的先根序列构造二叉树{ int i = 0; this->root = create(prelist,n,i);}template <class T>DoubleNode<T> * BinaryTree<T>::create(T prelist[], int n, int &i) //以标明空子树的先根次序遍历序列创建一颗子树,子树根结点是prelist[i],返回根结点指针{ DoubleNode<T> *p =NULL;if(i<n){ T elem = prelist[i]; i++; if(elem!=NULL) { p = new DoubleNode<T> (elem); //创建结点 p->prior = create(prelist, n , i); // 创建左子树 p->next = create(prelist,n,i); //创建右子树 }}return p;}
二叉树的广义表表示法:
template <class T>void BinaryTree<T>::PrintGList() //以广义表输出二叉树{ PrintGlist(this -> root);cout<<endl;}template<class T>void BinaryTree<T>::PrintGList(DoubleNode<T> *p){ if(p==NULL) cout<<"^"; else { cout<<p->data; if(p->prior!=NULL||p->next != NULL) { cout<<"("; PrintGlist(p->prior); cout<<","; PrintGlist(p->next); cout<<")"; } }}
插入:
template <class T>DoubleNode<T> *BinaryTree<T>::Insert(DoubleNode<T> *p, T value, bool priorChild ) //插入value作为P结点的孩子{ DoubleNode<T> *q = NULL; if(p!=NULL) if(priorChild) { q = new DoubleNode<T> (value,p->prior,NULL); p->prior = q; } else { q = new DoubleNode<T> (value,NULL,p->next);p->next = q; } return q;}删除:template <class T>void BinaryTree<T>::Remove(DoubleNode<T> *p, bool priorChild){ if(p!=NULL) if(priorChild) { Destroy(p->prior); //撤销左子树p->prior = NULL; } else { Destroy (p->next); // 撤销右子树p->next = NULL; }}
二叉树的非递归实现:
template <class T>void BinaryTree<T>::preRootTraverse() //先根次序遍历二叉树的非递归算法{ cout<<"先根次序遍历的非递归"; SeqStack<DoubleNode<T> *> stack; // 创建一个空栈 DoubleNode<T> * p = this ->root; while(p!=NULL||!stack.isEmpty()) //p非空或栈非空时 if(p!=NULL) { cout<<p->data<<" "; // 访问结点stack.push(p); // p结点入栈p = p->prior;// 进入左子树 } else { p=stack.pop(); p = p->next; } cout<<endl;}template <class T>void BinaryTree<T>::midRootTraverse(){ cout<<"中根次序遍历的非递归"; LinkedStack<DoubleNode<T> *> stack; //创建一个空栈 DoubleNode<T> *p =this->root; while(p!=NULL||!stack.isEmpty()) //p非空或栈非空树 if(p!=NULL) { stack.push(p);p = p->prior; } else { p = stack.pop();cout<<p->data<<" ";p = p->next; } cout<<endl;}template<class T>void BinaryTree<T>::LevelOrder() //按层次遍历二叉树{ cout<<"层次遍历: "; SeqQueue<DoubleNode<T> *>que; DoubleNode<T> *p = this->root; while(p!=NULL) { cout<<p->data<<" ";if(p->prior!=NULL) que.enqueue(p->prior);if(p->next!=NULL)que.enqueue(p->next);if(!que.isEmpty())p = que.dequeue();elsep = NULL; } cout<<endl;}
阅读全文
0 0
- 二叉树的查找、二叉树高度、二叉树获得双亲结点、构造二叉树、二叉树的广义表表示法、二叉树的插入删除、二叉树的非递归实现
- 二叉查找树的结点插入,查找,删除,计算二叉树的高度
- 【c++】二叉搜索树的插入、查找、非递归删除
- 二叉树的二叉链表表示与实现
- 二叉树的二叉链表表示与实现
- 二叉树的二叉链表表示与实现
- 二叉树的二叉链表表示与实现
- 二叉树的二叉链表表示和实现
- 二叉树的二叉链表表示与实现
- 求二叉树的高度(非递归)
- 二叉树------二叉树的下一个结点
- 二叉树:利用广义表创建二叉树,并实现指定结点的删除
- 二叉查找树的插入,删除,查找
- 二叉查找树的插入,删除,查找
- 二叉查找树的插入,删除,查找
- 二叉树的高度
- 二叉树的高度
- 二叉树的递归插入
- 通讯录
- tomcat+memcahed 缓存
- Android6.0 X86 ARM64位可用的注入Inject
- 06-图3 六度空间 (30分)
- Linux下创建、删除软链接
- 二叉树的查找、二叉树高度、二叉树获得双亲结点、构造二叉树、二叉树的广义表表示法、二叉树的插入删除、二叉树的非递归实现
- hibernate写原生sql
- cdn-varnish 高速缓存器
- eclice直接复制项目,包,类后运行时显示无法加载主类
- MarkDown基本使用小结
- Docker使用心得
- 决策树
- 哈希表(线性探测法处理冲突)
- C++作业6