二叉树的各种操作
来源:互联网 发布:linux修改文件所有者 编辑:程序博客网 时间:2024/06/03 16:20
#include <iostream>
#include <stdio.h>
#include <stack>
using namespacestd;
#define ok 1
#define error 0
#define overflow -2
typedef char NodeDataType;
int cnt ;
int deep ;
typedef struct BiTNode{
NodeDataType data;
structBiTNode *lchild,*rchild;
}BiTNode,*BiTree;
void InitBiTree(BiTree &T)//树的初始化
{
T = NULL;
}
void DestroyBiTree(BiTree &T)//销毁一个树
{
if(T)
{
DestroyBiTree(T ->lchild);
DestroyBiTree(T ->rchild);
delete T;
//T = NULL;
}
}
void CreateBiTree(BiTree &T)//创建一个树
{
char ch;
scanf("%c",&ch);
if(ch ==' ') T = NULL;
else
{
T = newBiTNode;
if(!T)
exit(overflow);
T -> data = ch;
CreateBiTree(T ->lchild);
CreateBiTree(T ->rchild);
}
return ;
}
void PreOrderTraverse(BiTree T)//先序访问
{
if(T)
{
cout << T ->data << " ";
PreOrderTraverse(T ->lchild);
PreOrderTraverse(T ->rchild);
}
//return ;
}
void InOrderTraverse(BiTree T)//中序访问
{
if(T)
{
InOrderTraverse(T ->lchild);
cout << T ->data << " ";
InOrderTraverse(T ->rchild);
}
//return ;
}
void PostOrderTraverse(BiTree T)//后序访问
{
if(T)
{
PostOrderTraverse(T ->lchild);
PostOrderTraverse(T ->rchild);
cout << T ->data << " ";
}
//return ;
}
BiTree Findmode(BiTree T,NodeDataType x)// 找到值为 x的结点
{
BiTree t;
if(T ==NULL)
t = NULL;
elseif(T -> data == x)
t = T;
else{
t = Findmode(T ->lchild,x);
if(t ==NULL)
t = Findmode(T ->rchild,x);
}
return t;
}
void countleaf(BiTree T,int *cnt)//统计叶子结点的个数
{
if(T)
{
if(T ->lchild == NULL && T ->rchild == NULL)
{
cout << T ->data << " ";
(*cnt)++;
}
countleaf(T ->lchild,cnt);
countleaf(T ->rchild,cnt);
}
}
int BiTreeDepth(BiTree T)//返回树的深度
{
int i =1,j = 1;
if(T ==NULL)
return0;
i += BiTreeDepth(T ->lchild);
j += BiTreeDepth(T ->rchild);
return i > j ? i : j;
}
void BiTreeClear(BiTree &T)
{
if(T)
{
T = NULL;
}
}
bool BiTreeEmpty(BiTree T)
{
if(T ==NULL)
returntrue;
else
returnfalse;
}
void InOrder(BiTree T)//中序非递归算法1
{
stack<BiTree> s;
s.push(T);
while(!s.empty())
{
BiTree p;
while((p = s.top()) && p) s.push(p ->lchild); //向左走到尽头
s.pop(); //空指针出栈
if(!s.empty())
{
p = s.top();
s.pop();
cout << p ->data << " ";
s.push(p ->rchild);
}
}
}
/*void InOrder(BiTree T) // 中序非递归算法2
{
stack<BiTree> s;
BiTree p = T;
while(p || !s.empty())
{
if(p) //根指针进栈,遍历左子树
{
s.push(p);
p = p -> lchild;
}
else //根指针退栈,访问根结点,遍历右子树
{
p = s.top();
s.pop();
if(!p)
exit(overflow);
cout << p -> data << " ";
p = p -> rchild;
}
}
}*/
int main()
{
BiTree T;
InitBiTree(T);//初始化
CreateBiTree(T); //创造一个树
InOrder(T);cout << endl;
cout <<" 先序:";PreOrderTraverse(T); cout <<endl; //先序遍历
cout <<" 中序:";InOrderTraverse(T); cout <<endl; //中序遍历
cout <<" 后序:";PostOrderTraverse(T); cout <<endl; //后序遍历
BiTree t =Findmode(T,'B');//找到值为 B的结点
if(t !=NULL) //如果找到了
{
if(t ->lchild != NULL)// 如果有左孩子
cout <<"左孩子:" << t ->lchild -> data <<endl;
if(t ->rchild != NULL)// 如果有右孩子
cout <<"右孩子:" << t ->rchild -> data <<endl;
}
int cnt =0;
cout <<"叶子结点都有:" ;
countleaf(T,&cnt);// 统计结点的个数
cout <<"叶子结点的个数为:" << cnt <<endl;
int depth =BiTreeDepth(T);
cout <<"树的深度为:" << depth <<endl;
cout <<BiTreeEmpty(T) << endl;
BiTreeClear(T);
cout <<BiTreeEmpty(T) << endl;
return0;
}
- 二叉树的各种操作
- 二叉树的各种操作
- 二叉树的各种操作
- 二叉树的各种操作
- 二叉树的各种操作
- 二叉树的各种操作
- 二叉树的各种操作
- 二叉树各种操作
- 二叉树各种操作
- 【树】二叉树的各种操作
- 二叉查找树的各种操作
- 二叉查找树的各种操作
- 二叉查找树的各种操作源码
- 二叉树的各种操作_源代码
- 遍历二叉树的各种操作
- 遍历二叉树的各种操作
- 二叉树各种操作的总结
- 二叉树的各种遍历操作
- 选项卡的项目不能完全显示(source insight 的设置问题)
- 杂谈:IT中的寒冬潮是否来了?
- Objective-C中的属性指示符
- 单例模式实现
- 我的iOS学习历程 - OC第七天
- 二叉树的各种操作
- c++虚函数
- Linux用户管理
- 从程序员到CTO的Java技术路线图 (转自安卓巴士)
- android 中Service 和activity之间的数据传递的几种方法
- 好坑啊 NYOJ303 序号互换
- T-SQL学习之路之数据库完整性之参规则
- Selenium Webdriver JS事件在各浏览器的区别,彻底解决Selenium鼠标悬停 Mouseover和hover问题
- redis3.0集群管理手册小记!