本实验取材于浙江大学《数据结构》。
输出二叉树中的叶子结点与输出二叉树中的结点相比,它是一个有条件的输出问题。唯一的区别就是执行“访问结点”的时候,先对该结点进行检测,看它是否是叶子结点,也就是看它左右子树是否都为空.所以只要在二叉树的遍历算法中增加检测条件就可以了。
//叶节点输出
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//树的层序遍历--采用队列模型
//设置一个队列结构,遍历从根节点开始,首先将根节点指针入队,然后开始执行下面三个操作:
//1、从队列中取出一个元素;
//2、访问该元素所指结点;
//3、若该元素所指结点的左右孩子结点非空,则将其左、右孩子的指针顺序入队
//不断执行这三部操作,直到队列为空,再无元素可取,二叉树的程序遍历就完成了。
#define ERROR -1
#define MaxSizel 10
//typedef struct SNode *PtrToSNode;
typedef int ElementType;
typedef struct TNode *Position;
typedef Position BinTree; /* 二叉树类型 */
struct TNode{ /* 树结点定义 */
ElementType Data; /* 结点数据 */
BinTree Left; /* 指向左子树 */
BinTree Right; /* 指向右子树 */
};
void PreorderPrintLeaves(BinTree BT)
{
if(BT){
if(!BT->Left && !BT->Right)//如果BT结点是叶子
printf("%d ",BT->Data);
PreorderPrintLeaves(BT->Left);
PreorderPrintLeaves(BT->Right);
}
}
int main()
{
BinTree Bt = (BinTree)malloc(sizeof(struct TNode));
BinTree Bt1 = (BinTree)malloc(sizeof(struct TNode));
BinTree Bt2 = (BinTree)malloc(sizeof(struct TNode));
BinTree Bt3 = (BinTree)malloc(sizeof(struct TNode));
BinTree Bt4 = (BinTree)malloc(sizeof(struct TNode));
BinTree Bt5 = (BinTree)malloc(sizeof(struct TNode));
BinTree Bt6 = (BinTree)malloc(sizeof(struct TNode));
Bt->Data = 1;Bt1->Data=2;Bt2->Data=3;
Bt3->Data=4;Bt4->Data=5;Bt5->Data=6;
Bt6->Data=7;
Bt->Left = Bt1;
Bt->Right = Bt2;
Bt1->Left = Bt3;
Bt1->Right = Bt4;
Bt2->Left = Bt5;
Bt2->Right = Bt6;
Bt3->Left = NULL;
Bt3->Right = NULL;
Bt4->Left = NULL;
Bt4->Right = NULL;
Bt5->Left = NULL;
Bt5->Right = NULL;
Bt6->Left = NULL;
Bt6->Right = NULL;
printf("\nye zi bian li\n");
PreorderPrintLeaves(Bt);
printf("\n");
return 0;
}