- 二叉树的最大深度
递归法:略
层序遍历法:每遍历一层,深度加一。
- 二叉树的最小深度
递归法:
和最大深度求法类似,只是需要考虑如果根节点只有一棵子树的时候,不能返回子树的最小值了,应该返回最大的。
int minDepth(TreeNode* root) {
if(!root) return 0;
else if(!root->left || !root->right){
int left = minDepth(root->left);
int right = minDepth(root->right);
return max(left, right) + 1;
}
else{
int left = minDepth(root->left);
int right = minDepth(root->right);
return min(left, right) + 1;
}
迭代法:
层序遍历,遇到的第一个叶子节点的深度即为最小深度。
- 完全二叉树的节点个数
递归法:略
迭代法:层序遍历
(以上两种方法的时间复杂度都是O(n))
特殊方法:根据满二叉树的性质计算
int countNodes(TreeNode* root) { //判断是否是满二叉树,如果是满二叉树,返回结点个数
if(!root) return 0;
TreeNode* left = root;
TreeNode* right = root;
int dp = -1;
while(left && right){
left = left->left;
right = right->right;
dp++;
}
if(!left && !right){
return (2 << dp) - 1; //递归的第二种条件,如果满二叉树,就返回
} //往下找,总能找到一棵满二叉树
return countNodes(root->right) + countNodes(root->left) + 1;
}
只是为什么时间复杂度为O(ln*ln)