C++实现二叉树
来源:互联网 发布:弱电箱网络模块modem 编辑:程序博客网 时间:2024/05/18 15:57
其中的 linkStack.h 和 linkQueue 分别在 以下两篇博文里:linkStack 、linkQueue
#include <iostream>#include "linkStack.h"#include "linkQueue.h"using namespace std;//定义节点template<class T>struct node{ T data; //结点中保存的数据 node *left; //结点的左儿子 node *right; //结点的右儿子 node():left(NULL),right(NULL){} //构造函数,无参数 //构造函数,带参数 node(const T &x,node *l=NULL,node *r=NULL):data(x),left(l),right(r){} ~node(){} //析构函数};//定义二叉树template<class T>class BT{ public: BT(); //构造空二叉树 BT(const T &x); //构造以数据值为x的结点为根结点的二叉树 BT(const node<T> *p); //构造以p为根结点的二叉树 node<T> * getRoot(); //返回根结点地址 //创建一个以数据值为x的结点为根结点,以lt为左子树、rt为右子树的二叉树 void makeTree(const T &x,BT <,BT &rt); void delLeft(); //删除左子树 void delRight(); //删除右子树 bool empty() const; //判断是否为空树 void clear(); //删除二叉树 int size() const; //求二叉树的规模 int height() const; //求二叉树的高度 int leafCount() const; //求二叉树叶子结点个数 void preOrder() const; //前序遍历二叉树 void midOrder() const; //中序遍历二叉树 void postOrder() const; //后续遍历二叉树 void levelOrder() const; //层次遍历二叉树 bool isCompBT() const; //判断是否为完全二叉树 void createTree(T flag); //创建二叉树,输入flag表示为空 void copyTree(BT &tree); //复制二叉树 ~BT(); //析构函数 private: node<T> *root; //二叉树的根结点 void clear(node<T> *t); //删除以t为根结点的二叉树 int size(node<T> *t) const; //求以t为根结点的二叉树的规模 int height(node<T> *t) const; //求以t为根结点的二叉树的高度 //复制以t为根结点的二叉树为以r为根结点的新二叉树 void copyTree(node<T> *&r,node<T> *t); };/*二叉树的实现*///构造空二叉树template <class T>BT<T>::BT(){ root=NULL;}//构造以数据值为x的结点为根结点的二叉树template <class T>BT<T>::BT(const T &x){ root=new node<T>(x);}//构造以p为根结点的二叉树template <class T>BT<T>::BT(const node<T> *p){ root=p;}//返回根结点地址template <class T>node<T> * BT<T>::getRoot(){ return root;}//创建一个以数据值为x的结点为根结点,以lt为左子树、rt为右子树的二叉树template <class T>void BT<T>::makeTree(const T &x,BT <,BT &rt){ root=new node<T>(x,lt.root,rt.root); lt.root=NULL; rt.root=NULL;}//删除左子树template <class T>void BT<T>::delLeft(){ if(root&&root->left) { BT tmp=root->left; root->left=NULL; tmp.clear(); }}//删除右子树template <class T>void BT<T>::delRight(){ if(root&&root->right) { BT tmp=root->right; root->right=NULL; tmp.clear(); }}//判断是否为空树template <class T>bool BT<T>::empty() const{ return root==NULL;}//删除二叉树template <class T>void BT<T>::clear(){ if(root) { clear(root); root=NULL; }}//删除以t为根结点的二叉树template <class T>void BT<T>::clear(node<T> *t){ if(t) { if(t->left) clear(t->left); if(t->right) clear(t->right); delete t; }}//求二叉树的规模template <class T>int BT<T>::size() const{ return size(root);}//求以t为根结点的二叉树的规模template <class T>int BT<T>::size(node<T> *t) const{ if(t) return 1+size(t->left)+size(t->right); return 0;}//求二叉树的高度template <class T>int BT<T>::height() const{ return height(root);}//求以t为根结点的二叉树的高度template <class T>int BT<T>::height(node<T> *t) const{ if(t) { int lt=height(t->left),rt=height(t->right); return 1+(lt>rt ? lt : rt); } return -1;}//求二叉树叶子结点个数template <class T>int BT<T>::leafCount() const{ /*递归实现: if(!t) return 0; if(!t->left&&!t->right) return 1; return leavesCount(t->left)+leavesCount(t->right); */ //非递归实现: int cnt=0; linkStack<node<T> *> stack; node<T> *t=root; if(t) { stack.push(t); while(!stack.empty()) { node<T> *tmp=stack.pop(); if(!tmp->left&&!tmp->right) ++cnt; if(tmp->right) stack.push(tmp->right); if(tmp->left) stack.push(tmp->left); } } return cnt;}//前序遍历二叉树template <class T>void BT<T>::preOrder() const{ /*递归实现: if(t) { cout<<t->data<<' '; preOrder(t->left); preOrder(t->right); } */ //非递归实现: if(root) { cout<<"\n前序遍历:"; linkStack<node<T> *> stack; node<T> *t=root; if(t) { stack.push(t); while(!stack.empty()) { node<T> *tmp=stack.pop(); cout<<tmp->data<<' '; if(tmp->right) stack.push(tmp->right); if(tmp->left) stack.push(tmp->left); } } }}//中序遍历二叉树template <class T>void BT<T>::midOrder() const{ /*递归实现: if(t) { midOrder(t->left); cout<<t->data<<' '; midOrder(t->right); } */ //非递归实现: if(root) { cout<<"\n中序遍历:"; linkStack<node<T> *> stack; node<T> *t=root; if(t) { while(t) { stack.push(t); t=t->left; } while(!stack.empty()) { node<T> *tmp=stack.pop(); cout<<tmp->data<<' '; if(tmp->right) { stack.push(tmp->right); node<T> *tmp1=tmp->right; while(tmp1->left) { stack.push(tmp1->left); tmp1=tmp1->left; } } } } }}//后续遍历二叉树template <class T>void BT<T>::postOrder() const{ /*递归实现: if(t) { postOrder(t->left); postOrder(t->right); cout<<t->data<<' '; } */ //非递归实现: if(root) { cout<<"\n后续遍历:"; linkStack<node<T> *> stack; node<T> *t=root; do { while(t) { stack.push(t); t=t->left; } node<T> *tmp=NULL; bool flag=1; while(!stack.empty()&&flag) { t=stack.top(); if(t->right==tmp) { cout<<t->data<<' '; stack.pop(); tmp=t; } else { t=t->right; flag=0; } } }while(!stack.empty()); }}//层次遍历二叉树template <class T>void BT<T>::levelOrder() const{ if(root) { cout<<"\n层次遍历:"; linkQueue<node<T> *> queue; node<T> *t=root; queue.enQueue(t); while(!queue.empty()) { t=queue.deQueue(); cout<<t->data<<' '; if(t->left) queue.enQueue(t->left); if(t->right) queue.enQueue(t->right); } }}//判断是否为完全二叉树template <class T>bool BT<T>::isCompBT() const{ if(!root) return 1; bool judge=1; bool flag=0; linkQueue<node<T> *> queue; queue.enQueue(root); while(!queue.empty()) { node<T> *tmp=queue.getHead(); if(flag) { if(tmp->left||tmp->right) { judge=0; break; } } else { if(tmp->left&&tmp->right) { queue.enQueue(tmp->left); queue.enQueue(tmp->right); } else if(!tmp->left&&tmp->right) { judge=0; break; } else { if(tmp->left) queue.enQueue(tmp->left); flag=1; } } queue.deQueue(); } while(!queue.empty()) queue.deQueue(); return judge;}//创建二叉树,输入flag表示为空template <class T>void BT<T>::createTree(T flag){ linkQueue<node<T> *> queue; node<T> *tmp; T x,ldata,rdata; //创建树,输入flag表示空 cout<<"\n输入根结点:"; cin>>x; if(x==flag) root=NULL; else { root=new node<T>(x); queue.enQueue(root); while(!queue.empty()) { tmp=queue.deQueue(); cout<<"\n输入"<<tmp->data<<"的两个儿子("<<flag<<"表示空结点):"; cin>>ldata>>rdata; if(ldata!=flag) queue.enQueue(tmp->left=new node<T>(ldata)); if(rdata!=flag) queue.enQueue(tmp->right=new node<T>(rdata)); } } cout<<"\n创建完成!\n\n";}//复制二叉树template <class T>void BT<T>::copyTree(BT &tree){ copyTree(root,tree.root);}//复制以t为根结点的二叉树为以r为根结点的新二叉树template <class T>void BT<T>::copyTree(node<T> *&r,node<T> *t){ if(t) { r=new node<T>(t->data); copyTree(r->left,t->left); copyTree(r->right,t->right); } else r=NULL;}//析构函数template <class T>BT<T>::~BT(){ clear();}
- 二叉树 c实现
- 二叉树 C实现
- 二叉树 c 实现
- 【二叉查找树】c实现
- 用c实现二叉树
- C语言实现二叉树
- 用c实现二叉树
- 二叉树递归C实现
- C语言实现二叉树
- C语言实现二叉树
- [C++] 实现二叉搜索树
- C语言实现二叉树
- 【c++】简单实现二叉树
- 二叉树数组实现[C/C++]代码
- 二叉树系列:初探二叉树,c语言实现
- c语言二叉树和二叉搜索树的实现
- 树和二叉树 C语言实现
- 二叉树遍历及C语言实现
- 使用<data android: 建立和activity的关联
- WIN7系统VC6中添加OCX出现“不支持此接口” 问题的解决方法
- java Object concurrent
- mysql中timestamp的使用
- 自定义图标签(防盗链)
- C++实现二叉树
- 厦门市2012年攻读硕士学位研究生报名现场确认考生须知
- VMware下安装Iphone开发环境(mac10.5.5+iphone sdk 3.0)
- JavaOne大会重点强调了移动和JavaFX,舍弃了JavaFX脚本(期待...强大java界面的出现)
- fedora 16 安装nvidia驱动
- java 操作 excel 2010
- 20111109==程序员
- 吃"软饭"的一些不良思考习惯
- 1109