二叉树的各种操作
2015-11-03 20:09
309 查看
#include <iostream>
#include <stdio.h>
#include <stack>
using namespace
std;
#define ok 1
#define error 0
#define overflow -2
typedef char NodeDataType;
int cnt ;
int deep ;
typedef struct BiTNode{
NodeDataType data;
struct
BiTNode *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 = new
BiTNode;
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;
else
if(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)
return
0;
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)
return
true;
else
return
false;
}
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;
return
0;
}
#include <stdio.h>
#include <stack>
using namespace
std;
#define ok 1
#define error 0
#define overflow -2
typedef char NodeDataType;
int cnt ;
int deep ;
typedef struct BiTNode{
NodeDataType data;
struct
BiTNode *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 = new
BiTNode;
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;
else
if(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)
return
0;
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)
return
true;
else
return
false;
}
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;
return
0;
}
相关文章推荐
- 单例模式实现
- 我的iOS学习历程 - OC第七天
- 我的iOS学习历程 - OC第七天
- Android_uiautomator支持输入中文
- 二叉排序树代码实现
- Oracle 不等于号
- 选项卡的项目不能完全显示(source insight 的设置问题)
- Codevs_P3186 队列练习2
- Objective-C中的属性指示符
- Spring Boot异常处理详解
- OC类别
- hud 3579 解同余方程的应用
- 伟大的进步————扩展欧几里得
- 关于eclipse中“fix project properties”
- Java过滤器,SpringMVC拦截器之间的一顺序点关系
- ListView onTouchEvent 快速滑动丢失 ACTION_DOWN事件
- 动态规划(1)
- 图像拼接(类stitcher 用于图像拼接)
- MySQLdb
- OC 协议