二叉树、二叉链表
2016-05-28 11:23
253 查看
</pre><pre name="code" class="cpp">#include <iostream> using namespace std; typedef char elemtype; int n=0; typedef struct BiNode { elemtype data; BiNode *lchild, *rchild; }BiNode; class BiTree { public: BiTree(){root=Creat();} ~BiTree(){Release(root);} BiNode * Getroot(); void PreOrder(BiNode *root); //前序遍历递归算法 void PreOrder2(BiNode *root); //前序遍历非递归算法 void InOrder(BiNode *root); //中序遍历递归算法 void InOrder2(BiNode *root); //中序遍历非递归算法 void PostOrder(BiNode *root); //后序遍历递归算法 void PostOrder2(BiNode *root); //后序遍历非递归算法 void LeverOrder(BiNode *root); //层序遍历 int Depth(BiNode *root) ; //求深度 void Count(BiNode *root); //求二叉树的结点个数 private: BiNode *root; BiNode* Creat(); void Release(BiNode *root); }; BiNode* BiTree::Getroot( ) { return root; } void BiTree::PreOrder(BiNode *root) { if (root ==NULL) return; //递归调用的结束条件 else { cout<<root->data; //访问根结点bt的数据域 PreOrder(root->lchild); //前序递归遍历bt的左子树 PreOrder(root->rchild); //前序递归遍历bt的右子树 } } void BiTree::PreOrder2(BiNode *root) { int top= -1; //采用顺序栈,并假定不会发生上溢 BiNode * s[100]; while (root!=NULL || top!= -1) { while (root!= NULL) { cout<<root->data; s[++top]=root; root=root->lchild; } if (top!= -1) { root=s[top--]; root=root->rchild; } } } void BiTree::InOrder (BiNode *root)// { if (root==NULL) return; else { InOrder(root->lchild); cout<<root->data; InOrder(root->rchild); } } void BiTree::InOrder2(BiNode *root) { int top=-1; //采用顺序栈,并假定不会发生上溢 BiNode* s[100]; while (root !=NULL||top!=-1) { while(root!=NULL) { s[++top]=root; //将根指针root入栈 root=root->lchild; } if (top!=-1) //栈非空 { root=s[top--]; cout<<root->data; root=root->rchild; } } } void BiTree::PostOrder(BiNode *root) { if (root==NULL) return; else { PostOrder(root->lchild); PostOrder(root->rchild); cout<<root->data; } } void BiTree::LeverOrder(BiNode *root) { int front,rear; BiNode * Q[100]; BiNode *q; front=rear=-1; //采用顺序队列,并假定不会产生上溢 if(root==NULL) return ; Q[++rear]=root; while (front!=rear) { q=Q[++front]; cout<<q->data; if(q->lchild!=NULL) Q[++rear]=q->lchild; if(q->rchild!=NULL) Q[++rear]=q->rchild; } } /* *前置条件:空二叉树 *输 入:数据ch; *功 能:初始化一棵二叉树,构造函数调用 *输 出:无 *后置条件:产生一棵二叉树 */ BiNode* BiTree::Creat() { BiNode* root; elemtype ch; cout<<"请输入创建一棵二叉树的结点数据"<<endl; cin>>ch; if (ch=='#') root = NULL; else{ root = new BiNode; //生成一个结点 root->data=ch; root->lchild = Creat(); //递归建立左子树 root->rchild = Creat(); //递归建立右子树 } return root; } void BiTree::Count(BiNode *root) //n为全局量并已初始化为0 { if (root) { Count(root->lchild); n++; Count(root->rchild); } } int BiTree::Depth(BiNode *root) //求二叉树深度 { int hl ,hr; if (root==NULL) return 0; else { hl= Depth(root->lchild); hr= Depth(root ->rchild); return max(hl, hr)+1; } } void BiTree::Release(BiNode *root) { if (root!=NULL) { Release(root->lchild); //释放左子树 Release(root->rchild); //释放右子树 delete root; //释放根结点 } } void main() { BiTree bt; // cout<<"请输入二叉树序列,如:AB#D##C##"<<endl; BiNode *root=bt.Getroot(); cout<<"树的前序遍历序列为:"<<endl; bt.PreOrder(root); cout<<endl; cout<<"------中序遍历------ "<<endl; bt.InOrder(root); cout<<endl; cout<<"------后序遍历------ "<<endl; bt.PostOrder(root); cout<<endl; cout<<"------层序遍历------ "<<endl; bt.LeverOrder(root); cout<<endl; cout<<bt.Depth(root)<<endl; }
相关文章推荐
- Ubuntu:网络配置
- npm介绍与cnpm介绍
- UVA 839 Not so Mobile (贪心)
- 搭建maven+spring+mybatis工程
- SD卡中FAT32文件格式快速入门(图文详细介绍)
- 一些关于内存缓冲区溢出的保护机制
- mac parallels
- BZOJ2453维护队列&&BZOJ2120数颜色
- 物惯(子到父节点)变换顺序原因和不同坐标系下的变换顺序详解
- HDU 1015 Safecracker (DFS)
- 360网站卫士 PHP-DOS攻击脚本专杀工具使用笔记
- Ubuntu 更改mac地址
- ecshop 后台增加设置选项(系统控制变量)的方法____2016年5月28日
- XML解析之PULL解析
- 29.浅谈vim的buffer、window和tab
- 记一次作为主讲人的培训经历
- poj 2406 Power Strings
- 自定义UITextView
- 简单结构体排序
- openwrt编译日志