您的位置:首页 > 其它

二叉树的各种操作

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: