二叉树遍历

来源:互联网 发布:保险网络增员话术 编辑:程序博客网 时间:2024/04/30 22:52
  

# include <stdio.h>
# include <stdlib.h>
# include <conio.h>
# define STACK_MAX_SIZE 20
# define NULL 0
struct BTreeNode
{
char data;
struct BTreeNode *left;
struct BTreeNode *right;
};

//
void initBTree(struct BTreeNode* *bt)
{
*bt = NULL;
return ;
}
//****************************************************//
//设计算法返回二叉树中值为x的结点所在的层号,若二叉树中没有该结点,则返回0。
//***************************************************//
int NodeLevel(BTreeNode *bt,char x)
{
int i,j;
if(bt == NULL)
return 0;
else if(bt ->data == x)
return 1;
else
{
i = NodeLevel(bt ->left,x);
if(i>=1) i++;
j = NodeLevel(bt ->right,x);
if(j>=1) j++;
if(i>=1 || j>=1)
return i > j ? i : j;
else return 0;
}
}
//
void createBTree(struct BTreeNode* *bt,char *a)
{
struct BTreeNode *p;
struct BTreeNode *s[STACK_MAX_SIZE];
int top = -1;
int k;
int i = 0;
*bt = NULL;
//
while(a[i]!= '\0')
{
switch(a[i])
{
case' ':
break;
case'(':
if(top == STACK_MAX_SIZE - 1)
{
printf("栈空间太小!");
exit(1);
}
top++;
s[top] = p;
k = 1;
break;
case')':
if(top == -1)
{
printf("二叉树广义表字符串错误!");
exit(1);
}
top--;
break;
case',':
k = 2;
break;
default:
p = (struct BTreeNode*)malloc(sizeof(struct BTreeNode));
p ->data = a[i];
p ->left = p ->right = NULL;
if(*bt == NULL)
{
*bt = p;
}
else
{
if(k == 1)
{
s[top] ->left = p;
}
else
{
s[top] ->right = p;
}
}
}
i++;
}
return;
}
//检查二叉树是否为空
int emptyBTree(struct BTreeNode *bt)
{
if(bt == NULL)
{
return 1;
}
else
{
return 0;
}
}

//求二叉树深度
int BTreeDepth(struct BTreeNode *bt)
{
if(bt == NULL)
{
return 0;
}
else
{
int dep1 = BTreeDepth(bt ->left);
int dep2 = BTreeDepth(bt ->right);
if(dep1 < dep2)
{
return dep1 + 1;
}
else
{
return dep2 + 2;
}
int NodeNum;
NodeNum = NodeNum + 1;
}
}

//在二叉树中查找值为x的结点,若存在则返回元素的存储位置
char *findBTree(struct BTreeNode *bt,char x)
{
if(bt == NULL)
{
return NULL;
}
else
{
if(bt ->data == x)
{
return &(bt ->data);
}
else
{
char *p;
if(p = findBTree(bt ->left,x))
{
return p;
}
if(p = findBTree(bt ->right,x))
{
return p;
}
return NULL;
}
}
}
//计算叶子结点数
int Searchlcaf(struct BTreeNode *bt)
{
if(bt == NULL)
return 0;
else
{
if(bt ->left == NULL && bt ->right == NULL)
{
return 1;
}
else
{
return(Searchlcaf(bt ->left) + Searchlcaf(bt ->right));
}
}
}

//计算二叉树的结点个数
int Counter(struct BTreeNode *bt)
{
int n1,n2,num;
if(bt == NULL)
{
return 0;
}
else
{
n1 = Counter(bt ->left);
n2 = Counter(bt ->right);
num = n1 + n2 +1;
return num;
}
}


//先序遍历

void PreOrderTraverse(struct BTreeNode *bt)
{
if(bt == NULL)
return;
printf("%C",bt ->data);
PreOrderTraverse(bt ->left);
PreOrderTraverse(bt ->right);
}
//中序遍历

void InOrderTraverse(struct BTreeNode *bt)
{
if(bt == NULL)
return;
InOrderTraverse(bt ->left);
printf("%C",bt ->data);
InOrderTraverse(bt ->right);
}

//后序遍历

void PostOrderTraverse(struct BTreeNode *bt)
{
if(bt == NULL)
return;
PostOrderTraverse(bt ->left);
PostOrderTraverse(bt ->right);
printf("%C",bt ->data);
}

//清除二叉树,使之变成一颗空二叉树

void clearBTree(struct BTreeNode *bt)
{
if(bt != NULL)
{
clearBTree(((bt) ->left));
clearBTree(((bt) ->right));
free(bt);
bt = NULL;
}
return;
}

void ShowA(struct BTreeNode *bt)
{
if(bt != NULL)
{
printf("%c",bt ->data);
ShowA(bt ->left);
ShowA(bt ->right);
}
}

//
void ShowB(struct BTreeNode *bt)
{
if(bt != NULL)
{
ShowB(bt ->left);
printf("%c",bt ->data);
ShowB(bt ->right);
}
}

void ShowC(struct BTreeNode *bt)
{
if(bt != NULL)
{
ShowC(bt ->left);
ShowC(bt ->right);
printf("%c",bt ->data);
}
}
//
void Revolute(struct BTreeNode *bt)
{
BTreeNode *q;
if(bt != NULL)
{
Revolute(bt ->left);
Revolute(bt ->right);
q = bt ->left;
bt ->left = bt ->right;
bt ->right = q;
}
}


void main()
{
struct BTreeNode *bt;
initBTree(&bt);//初始化二叉树
char *a = "A(B(C),D(E(F,G),H(,I)))";
createBTree(&bt,a);
printf("01111653-钱伯江");
printf("\n\n");

int m;
m = BTreeDepth(bt);
printf("二叉树的深度为:");
printf("%d\n", m);

printf("\n");
printf("前序遍历的结果是:");
PreOrderTraverse(bt);
printf("\n");

printf("中序遍历的结果是:");
InOrderTraverse(bt);
printf("\n");

printf("后序遍历的结果是:");
PostOrderTraverse(bt);
printf("\n\n");

int d;
d = Counter(bt);
printf("二叉树结点的总个数为:");
printf("%d\n", d);
printf("\n");

int n;//n为叶子结点的个数
n = Searchlcaf(bt);
printf("叶子结点(度为0)的个数为:");
printf("%d\n", n);
//printf("\n");

int b;//b为度为2的结点个数
b = n - 1;
printf("度为2的个数为:");
printf("%d\n", b);
//printf("\n");
//s为度为1的结点
int x;
x = Counter(bt);
int y;
y = Searchlcaf(bt);
int l;
l = x - y;
int s;
s = l - b;
printf("度为1的个数为:");
printf("%d\n", s);
printf("\n");
printf("二叉树交换左右子树后,遍历结果如下。\n");
printf("\n");
printf("前序遍历结果:");
Revolute(bt);
ShowA(bt);
printf("\n");
printf("中序遍历结果:");
ShowB(bt);
printf("\n");
printf("后序遍历结果:");
ShowC(bt);

printf("\n");
char t;
int h;
scanf("%s",&t);
NodeLevel(bt,t);
h=NodeLevel(bt,t);
printf("%d\n",h);

 

}

0 0
原创粉丝点击