二叉樹遍歷

  

# 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));
}
}
}it

//計算二叉樹的結點個數
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;
}
}io


//先序遍歷二叉樹

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);
}nio

//後序遍歷top

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

//清除二叉樹,使之變成一顆空二叉樹

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);

 

}

相關文章
相關標籤/搜索