二叉树的遍历、深度、叶子节点个数( C++ )
用递归的方法实现以下二叉树算法:
(1) 以二叉链表表示二叉树,建立一棵二叉树(先序);
(2) 输出二叉树的中序遍历结果;
(3) 输出二叉树的前序遍历结果;
(4) 输出二叉树的后序遍历结果;
(5) 计算二叉树的深度;
(6) 统计二叉树的叶子结点个数;:
1.源代码
#include <stdio.h>
#include <malloc.h>
#include <iostream>
#define Max_size 100
typedef char ElemType;
typedef struct node
{
ElemType data;
struct node *lchild;
struct node *rchild;
}BTNode;
void CreateBTree(BTNode *&b, char *str)
{
BTNode *St[Max_size], *p;
int top = -1,k,j = 0;
char ch;
b = NULL;
ch = str[j];
while (ch != '\0')
{
switch (ch) {
case '(':top++;St[top] = p;k = 1;break;
case ')':top--;break;
case ',':k = 2;break;
default:p = (BTNode *)malloc(sizeof(BTNode));
p->data = ch;p->lchild = p->rchild = NULL;
if (b == NULL)
b = p;
else
{
switch (k) {
case 1:St[top] -> lchild = p;break;
case 2:St[top] -> rchild = p;break;
}
}
}
j++;
ch = str[j];
}
}
void Destory(BTNode *&b)
{
if(b != NULL)
{
Destory(b ->lchild);
Destory(b ->rchild);
free(b);
}
}
BTNode *Find(BTNode *b, ElemType x)
{
BTNode *p;
if (b == NULL)
return NULL;
else if (b->data == x)
return b;
else
{
p = Find(b->lchild,x);
if (p != NULL)
return p;
else
return Find(b->rchild,x);
}
}
BTNode * LchildNode(BTNode *p)
{
return p->lchild;
}
BTNode * RchildNode(BTNode *p)
{
return p->rchild;
}
int Height(BTNode *b)
{
int lchildh,rchildh;
if(b == NULL)
return 0;
else
{
lchildh = Height(b ->lchild);
rchildh = Height(b ->rchild);
return (lchildh > rchildh)?(lchildh + 1):(rchildh + 1);
}
}
void Display(BTNode *b)
{
if (b != NULL)
{
printf("%c", b->data);
if (b ->lchild != NULL || b ->rchild != NULL)
{
printf("(");
Display(b->lchild);
if (b ->rchild != NULL)
printf(",");
Display(b ->rchild);
printf(")");
}
}
}
void PreOrder(BTNode *b)
{
if (b != NULL)
{
printf("%c", b ->data);
PreOrder(b ->lchild);
PreOrder(b ->rchild);
}
}
void InOrder(BTNode *b)
{
if (b != NULL)
{
InOrder(b ->lchild);
printf("%c", b ->data);
InOrder(b->rchild);
}
}
void PostOrder(BTNode *b)
{
if (b != NULL)
{
PostOrder(b -> lchild);
PostOrder(b -> rchild);
printf("%c", b->data);
}
}
int LeafNode(BTNode *b)
{
int num1, num2;
if(b == NULL)
return 0 ;
else if (b ->lchild == NULL && b -> rchild == NULL)
return 1;
else
{
num1 = LeafNode(b -> lchild);
num2 = LeafNode(b -> rchild);
return (num1 +num2);
}
}
int main()
{
char TREE;
BTNode *b;
printf("请输入以括号形式定义的二叉树:\n");
scanf("%s", &TREE);
CreateBTree(b, &TREE);
printf("二叉树:");
Display(b);
printf("\n");
printf("先序遍历:\n");
PreOrder(b);printf("\n");
printf("中序遍历:\n");
InOrder(b);printf("\n");
printf("后续遍历:\n");
PostOrder(b);printf("\n");
printf("二叉树的深度为%d\n", Height(b));
printf("二叉树的叶子结点的个数为%d\n", LeafNode(b));
return 1;
}
2.结果展示
如下图: