算法day41 完全二叉树的节点个数
题目描述
解法1:普通二叉树解法
完全二叉树它也是二叉树,所以我们可以采用二叉树求总的节点数的通法,采用后序遍历的方式,即可求解。这里采用后序而非前序遍历与中序遍历的原因是因为这两种遍历方式会二次访问根节点,在统计节点时更加复杂。具体的代码如下。
public:
int inorderTraversal(TreeNode* cur){
if(cur == nullptr) return 0;
int left_num = inorderTraversal(cur->left);
int right_num = inorderTraversal(cur->right);
return left_num+right_num+1;
}
int countNodes(TreeNode* root) {
return inorderTraversal(root);
}
时间复杂度;O(n)
空间复杂度:O(h)
解法2:利用完全二叉树性质结合递归
由于满二叉树的节点数等于2h-1,所以我们可以通过对左子树与右子树进行遍历,同时判断左右子树的深度是否相等,相等则说明其是满二叉树,返回2h-1,否则就像普通二叉树一样正常的递归返回值累加。整体的代码如下。
int countNodes(TreeNode* root) {
if(root == nullptr) return 0;
TreeNode *left = root -> left;
TreeNode * right = root -> right;
int left_depth = 0;
int right_depth = 0;
while(left){
left = left->left;
left_depth++;
}
while(right){
right = right ->right;
right_depth++;
}
if(left_depth == right_depth) return (2<<left_depth) - 1;
int left_num = countNodes(root->left);
int right_num = countNodes(root->right);
return left_num + right_num + 1;
}
时间复杂度:O(n)
空间复杂度:O(h)
END