您的位置:首页 > 其它

递归遍历二叉树

2016-05-18 23:27 267 查看
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

// 二叉链表表示法
typedef struct tag_BiTNode
{
struct tag_BiTNode *lchild;	// 左孩子
struct tag_BiTNode *rchild;	// 右孩子
char data;	// 数据
}BiTNode;

// 先序遍历
void xianxuOrder(BiTNode * root)
{
// 空树 递归结束的条件
if (root == NULL)
{
return;
}
// 先根
printf("%c  ", root->data);
// 左子树
xianxuOrder(root->lchild);
// 右子树
xianxuOrder(root->rchild);
}

// 中序遍历
void zhongxuOrder(BiTNode* root)
{
// 空
if (root == NULL)
{
return;
}
// 左子树
zhongxuOrder(root->lchild);
// 根节点
printf("%c  ", root->data);
// 右子树
zhongxuOrder(root->rchild);
////
}

// 后序遍历
void houxuOrder(BiTNode* root)
{
// 空
if (root == NULL)
{
return;
}
// 左子树
houxuOrder(root->lchild);
// 右子树
houxuOrder(root->rchild);
// 根节点
printf("%c  ", root->data);
}

// 求树的叶子节点数
int num = 0;
void leafNum(BiTNode* root)
{
// 空树
if (root == NULL)
{
return;
}
// 叶子节点
if (root->lchild == NULL && root->rchild == NULL)
{
num++;
}
// 遍历左子树
leafNum(root->lchild);
// 右子树
leafNum(root->rchild);
}

void leafNum_plus(BiTNode* root, int *num)
{
// 空树
if (root == NULL)
{
return;
}
// 叶子节点
if (root->lchild == NULL && root->rchild == NULL)
{
(*num)++;
}
// 遍历左子树
leafNum_plus(root->lchild, num);
// 右子树
leafNum_plus(root->rchild, num);
}

int leafNum_plus2(BiTNode* root)
{
// 空树
if (root == NULL)
{
return 0;
}
if (root->lchild == NULL && root->rchild == NULL)
{
printf(" %c  ", root->data);
return 1;
}
int left = leafNum_plus2(root->lchild);
int right = leafNum_plus2(root->rchild);

return left + right;
}

void main()
{
BiTNode nodeA, nodeB, nodeC, nodeD, nodeE, nodeF, nodeG;
memset(&nodeA, 0, sizeof(BiTNode));
memset(&nodeB, 0, sizeof(BiTNode));
memset(&nodeC, 0, sizeof(BiTNode));
memset(&nodeD, 0, sizeof(BiTNode));
memset(&nodeE, 0, sizeof(BiTNode));
memset(&nodeF, 0, sizeof(BiTNode));
memset(&nodeG, 0, sizeof(BiTNode));

// 赋值
nodeA.data = 'A';
nodeA.lchild = &nodeB;
nodeA.rchild = &nodeC;

nodeB.data = 'B';
nodeB.lchild = &nodeD;
nodeB.rchild = &nodeE;

nodeC.data = 'C';
nodeC.lchild = &nodeF;
nodeC.rchild = &nodeG;

nodeD.data = 'D';
nodeE.data = 'E';
nodeF.data = 'F';
nodeG.data = 'G';

// 先序
printf("先序遍历: \n");
xianxuOrder(&nodeA);
printf("\n");

// 中序
printf("中序遍历: \n");
zhongxuOrder(&nodeA);
printf("\n");

// hou序
printf("后序遍历: \n");
houxuOrder(&nodeA);
printf("\n");

leafNum(&nodeA);
printf("叶子节点数: %d\n", num);

int nuber = 0;
leafNum_plus(&nodeA, &nuber);
printf("叶子节点数_plus: %d\n", nuber);

nuber = leafNum_plus2(&nodeA);
printf("叶子节点数_plus: %d\n", nuber);

system("pause");
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: