每日算法题【二叉树】:计算二叉树节点的个数、叶子结点的个数、第k层节点的个数
(16)计算二叉树节点的个数
-
解题思路:
通过前序遍历二叉树,使用三目操作符进行判断,节点为空则返回0,节点不为空递到下一层进行判断并
+1
,这个+1
代表这个不空的根节点。递归思想:二叉树总节点个数 等于 左右子树总节点个数 + 1
int TreeSize(BTNode* root){return root==NULL ? 0 : TreeSize(root->left) + TreeSize(root->right) + 1; }
(17)计算二叉树叶子节点的个数
-
解题思路:
使用前序遍历每个节点,其左右子节点均为空则为叶子结点。
int TreeLeafSize(BTNode* root){if(root == NULL){return 0;}if(root->left == NULL && root->right == NULL){return 1;}return TreeLeafSize(root->left) + TreeLeafSize(root->right); }
(18)计算二叉树第k层节点个数
-
解题思路:
通过前序遍历二叉树,每递下去一层k-1,k=1时的节点总个数就是结果
如何返回k层的节点个数:当k=1时,return 1;并通过递归相加即可得到k层总个数
k为什么要传值而不是地址:因为如果传地址,则遍历左子节点和右子节点递到下一层时都会对同一个k-1
而传值才能避免这个问题并保证两子树遍历的层数相同
int TreeLevelKSize(BTNode* root,int k){if(root == NULL){return 0;}if(k == 1){return 1;}return TreeLevelKSize(root->left,k-1) + TreeLevelKSize(root->right,k-1); }