前言
在熟练掌握二叉树四种基本遍历方法的基础上,本文将深入探讨以下进阶问题:节点总数统计、叶子节点计算、第 k 层节点数量确定、节点的查找以及树高测量。
这些内容将帮助读者深化对二叉树结构的理解与应用能力,以及深入理解递归分治思想。
一、前置说明
本文所描述的二叉树都是链式二叉树,其定义方式如下所示:
typedef char BTDataType;
typedef struct BinaryTree {
BTDataType data;
struct BinaryTree* left;
struct BinaryTree* right;
}BTNode;
二、二叉树的创建及销毁
通过前序遍历的数组 "ABD##E#H##CF##G##" 构建二叉树,其中 '#' 表示该节点为 NULL,二叉树如下图所示:

前序遍历的思想为:先访问根节点 -> 再访问左子树 -> 最后访问右子树。
依照前序遍历的思想,我们可以得出核心构建二叉树的逻辑:'先处理当前节点,再递归构建左子树,最后递归构建右子树'。
BTNode* BinaryTreeCreate(char* a, int n, int* pi) {
if (a[*pi] == '#') {
(*pi)++;
return NULL;
}
BTNode* root = (BTNode*)malloc(sizeof(BTNode));
root->data = a[(*pi)++];
root->left = BinaryTreeCreate(a, n, pi);
root->right = BinaryTreeCreate(a, n, pi);
return root;
}
**核心逻辑:**整个递归从根节点 A 开始,按'当前节点→左子树→右子树'的前序逻辑推进。
①先取 A 为节点,递归构建其左子树(以 B 为节点)。
②B 节点下先递归构建左子树(D 节点,左右均为 #则返回),再构建右子树(E 节点,左为 #,右递归到 H 节点,H 左右均为 #则返回)。
③A 的右子树以 C 为节点,递归构建左子树(F 节点,左右均为 #返回)和右子树(G 节点,左右均为 #返回),遇 #则终止当前分支递归,逐层完成构建。
对于二叉树的销毁而言,我们需要按照后序遍历的思想:先访问左子树 -> 再访问右子树 -> 最后访问根节点。


