文档讲解:代码随想录
视频讲解:二叉树的高度和深度有啥区别?究竟用什么遍历顺序?很多录友搞不懂 | LeetCode:104.二叉树的最大深度_哔哩哔哩_bilibili
第十五天,二叉树部分还是挺多的,继续打卡继续开练!
104.二叉树的最大深度
思路:采用一个后序遍历,当然是利用递归,这题中根节点的高度也是二叉树的最大深度。总的来说还是很容易实现的
class solution{
public:
int getDepth(TreeNode* node){
if(node == NULL) return 0;
int leftdepth = getDepth(node->left);
int rightdepth = getDepth(node->right);
int depth = 1 + max(node->left, node->right);
return depth;
}
int maxDpeth(TreeNode* root){
getDepth(root);
return root;
}
};
111.二叉树的最小深度
思路:跟上题比较类似,但因为我们要求的是最小深度,所以在处理中间节点也就是父节点的时候需要进行判断,而不能直接根据哪个子树高度最低返回对应的值。
最小深度是从根节点到最近叶子节点的最短路径上的节点数量。,注意是叶子节点。而左右孩子为空的节点才是叶子节点。
class solution{
public:
int getHight(TreeNode* node){
if(node == NULL) return 0;
int lefthight = getHight(node->left);
int righthight = getHight(node->right);
if(node->left == NULL && node->right != NULL){
return righthight + 1;
}
if(node->left != NULL && node->right == NULL){
return lefthight + 1;
}
int result = 1 + min(lefthight, righthight);
return result;
}
int minHight(TreeNode* root){
get(root);
return root;
}
};
222.完全二叉树节点的数量
思路:首先得明白完全二叉树的概念,要么是满二叉树,要么就是叶子节点没填满。其次我们要注意的是递归出口的处理判断,判断是否为满二叉树我们只需要遍历每个子树的最左侧节点数量和最右侧节点数量,如果相等即为满二叉树。最后通过公式,即完全二叉树满足总节点数为2的高度减一次方那么多。
class solution{
public:
int getNum(TreeNode* node){
if(node == NULL) return 0;
int left = node->left;
int right = node->right;
int leftdepth = 0, rigthdepth = 0;
while(left){
left = left->left;
leftdepth++;
}
while(right){
right = right->right;
rightdepth++;
}
if(leftdepth == rightdepth) return (2 << leftdepth) - 1;
}
int leftnum = getNum(node->left);
int rightnum = getNum(node->right);
int result = leftnum + rightnum + 1;
return result;
};
总结:又写到这个时候,近晚上十一点,不知道付出到底有没有收获,只能继续撑着。陌生人,共勉。