目录
链式二叉树示意图
手搓一个链式二叉树
代码演示:
// 数据类型
typedef int BTDataType;
// 二叉树节点的结构
typedef struct BinaryTreeNode
{
BTDataType data; //每个节点的数据
struct BinaryTreeNode* left; //指向左子树的指针
struct BinaryTreeNode* right; //指向右子树的指针
}BTNode;
// 申请新节点
BTNode* BuyNode(BTDataType x)
{
BTNode* newnode = (BTNode*)malloc(sizeof(BTNode));
// 判断是否申请成功
if (newnode == NULL)
{
perror("malloc fail");
return NULL;
}
// 初始化
newnode->data = x;
newnode->left = NULL;
newnode->right = NULL;
return newnode;
}
BTNode* CreatBinaryTree()
{
BTNode* n1 = BuyNode(1);
assert(n1);
BTNode* n2 = BuyNode(2);
assert(n2);
BTNode* n3 = BuyNode(3);
assert(n3);
BTNode* n4 = BuyNode(4);
assert(n4);
BTNode* n5 = BuyNode(5);
assert(n5);
BTNode* n6 = BuyNode(6);
assert(n6);
n1->left = n2;
n1->right = n4;
n2->left = n3;
n4->left = n5;
n4->right = n6;
return n1;
}
计算链式二叉树第k层的节点个数
代码演示:
int BTreeLevelKSize(BTNode* root, int k)
{
assert(k > 0);
if (root == NULL)
return 0;
if (k == 1)
return 1;
return BTreeLevelKSize(root->left, k - 1) + BTreeLevelKSize(root->right, k - 1);
}
代码解析:
要保证 k 大于 0 ,因为层数不可能为负数,利用 assert 断言
当 root 为空的时候,那么就是没有节点,返回 0
上面的 root 判空已经确保了 root 为空的情况,所以只需要判断 k 是否为 1 的情况
为什么要判断 k 是否为 1 呢?
因为是计算第 k 层的节点个数,可以把第一层看作 k ,层数越高,k 就递减,当 k 递减到 1 时,那一层就是第 k 层
最后再将 root 的左右子树所得到的第 k 层的个数相再返回,就是第 k 层的节点个数
大致走读代码(以上图为例子):
首次进入函数,root 为 1 节点,那么先走 BTreeLevelKSize(root->left, k - 1)
直到走到 root 为 3 节点的 left 节点,left 节点为空,返回 0
返回到上一层,也就是 root 为 3 节点的时候,再走 root 的 right 节点,同样为空,返回 0
再次返回到 root 为 3 节点的时候,这时候的 k 为 1,那么就返回 1
返回到 root 为 2 节点的时候,2 节点的 right 为空, 返回 0
2 节点的左右子树都走完了,返回 1 + 0
返回到 root 为 1 节点的时候,再走 BTreeLevelKSize(root->right, k - 1)..................
最后递归走完后,返回的值就是第 k 层的节点个数
代码验证: