由于我们说过,在进行二叉树遍历时所走的路线是一样的只是访问结点的时机不同而已,对于这个问题,我们采用任意一种遍历方式;
只要在输出结点的时候加一个前置的条件判定——“该节点的左右子树是否都为空?”。
void PreOrderPrintLeaves( BinTree BT )
{
if( BT ) {
if ( !BT-Left && !BT->Right )
printf(“%d”, BT->Data );
PreOrderPrintLeaves ( BT->Left );
PreOrderPrintLeaves ( BT->Right );
}
}
完整代码示例
#include <stdio.h>
#include <stdlib.h>
// 定义树节点的结构
typedef struct TreeNode {
int Data;
struct TreeNode *Left;
struct TreeNode *Right;
} TreeNode, *BinTree;
// 创建一个新的节点
BinTree CreateNode(int data) {
BinTree newNode = (BinTree)malloc(sizeof(TreeNode));
newNode->Data = data;
newNode->Left = NULL;
newNode->Right = NULL;
return newNode;
}
// 预排序打印叶子节点的函数
void PreOrderPrintLeaves(BinTree BT) {
if (BT) {
if (!BT->Left && !BT->Right)
printf("%d ", BT->Data);
PreOrderPrintLeaves(BT->Left);
PreOrderPrintLeaves(BT->Right);
}
}
// 主函数
int main() {
// 创建一个简单的二叉树
// 1
// / \
// 2 3
// / \ \
// 4 5 6
BinTree root = CreateNode(1);
root->Left = CreateNode(2);
root->Right = CreateNode(3);
root->Left->Left = CreateNode(4);
root->Left->Right = CreateNode(5);
root->Right->Right = CreateNode(6);
// 调用PreOrderPrintLeaves函数并打印叶子节点
printf("叶子节点: ");
PreOrderPrintLeaves(root);
printf("\n");
// 释放内存
free(root->Left->Left);
free(root->Left->Right);
free(root->Left);
free(root->Right->Right);
free(root->Right);
free(root);
return 0;
}
输出结果: