**
1:二叉树的遍历(借助队列的先进先出特点来实现)
**
#include <stdio.h>
#include <stdlib.h>
typedef char ElementType;
typedef struct TNode *Position;
typedef Position BinTree;
struct TNode{
ElementType Data;
BinTree Left;
BinTree Right;
};
BinTree CreatBinTree(); /* 实现细节忽略 */
void InorderTraversal( BinTree BT );
void PreorderTraversal( BinTree BT );
void PostorderTraversal( BinTree BT );
void LevelorderTraversal( BinTree BT );
int main()
{
BinTree BT = CreatBinTree();
printf("Inorder:"); InorderTraversal(BT); printf("\n");
printf("Preorder:"); PreorderTraversal(BT); printf("\n");
printf("Postorder:"); PostorderTraversal(BT); printf("\n");
printf("Levelorder:"); LevelorderTraversal(BT); printf("\n");
return 0;
}
/* 你的代码将被嵌在这里 */
先上答案
void InorderTraversal( BinTree BT )
{
if(BT)
{
InorderTraversal(BT->Left);
printf(" %c",BT->Data);
InorderTraversal(BT->Right);
}
}
void PreorderTraversal( BinTree BT )
{
if(BT)
{printf(" %c",BT->Data);
PreorderTraversal(BT->Left);
PreorderTraversal(BT->Right);
}
}
void PostorderTraversal( BinTree BT )
{
if(BT)
{
PostorderTraversal(BT->Left);
PostorderTraversal(BT->Right);
printf(" %c",BT->Data);
}
}
void LevelorderTraversal(BinTree BT)
{
if (BT == NULL)
{
return ;
}
int front = -1;
int rear = -1;
BinTree *Q = (BinTree *)malloc(sizeof(BinTree)*100);
Q[++rear] = BT;//入队
while (front != rear)
{
BT = Q[++front];//出队
printf(" %c",BT->Data);
if (BT->Left != NULL) Q[++rear] = BT->Left;
if (BT->Right != NULL) Q[++rear] = BT->Right;
}
}
前序遍历那几种都十分简单,都是递归,只需要交换代码顺序即可,但层序遍历就需要借助到队列进行实现。因为队列有先进先出的特点,所以我们先将二叉树的根节点放进队列之中,再出队列,如果还有左右子树,将其入队即可,由于先进先出,所以并不影响输出的顺序,如此循环,直到遍历完成即可,即rear==front得时候结束。注意二叉树BT也只是一个指向根节点的指针而已。所以进行出队移动的时候只需要BT = Q[++front];
2.递归在二叉树中的运用
a:求二叉树的高度(注意返回的时候要加上根节点的个数)
int GetHeight( BinTree BT )
{
if(BT==NULL)
return 0;
else
{
int m=0,n=0;
m=GetHeight(BT->Left);
n=GetHeight(BT->Right);
if(m>n)
return m+1;
else
return n+1;
}
}
b:求二叉树的结点个数
int NodeCount( BinTree BT )
{
if(BT==NULL)
return 0;
else
return NodeCount(BT->Left)+NodeCount(BT->Right)+1;
}
同样,返回的时候应该是左子树的结点个数+右子树的结点个数+根节点数1.
** c.先序输出叶结点 (15分) 本题要求按照先序遍历的顺序输出给定二叉树的叶结点。**
void PreorderPrintLeaves( BinTree BT )
{
if(BT==NULL)
return ;
if(BT->Left==NULL&&BT->Right==NULL)
printf(" %c",BT->Data);
PreorderPrintLeaves( BT->Left );
PreorderPrintLeaves( BT->Right );
}
注意这里直接进行左右子树的调用,我开始还写了个判断左或右子树是否为空,这样会导致不满足先序遍历的条件,因为主函数中有为空树的情况,直接退出递归。