LeetCode 104.二叉树的最大深度
题目链接:104.二叉树的最大深度
踩坑:先看了视频,需要辨析的就是树的高度(节点到叶子节点的距离)和深度(节点到根节点的距离)
思路:这是一道用层序遍历解决过的问题。在此是为了练习递归。使用后序遍历可以求解高度,而根节点的高度恰恰就是最大深度,若使用前序遍历求解深度,则无法直接得到(根节点的深度为1)。
代码:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
int maxDepth(TreeNode* root) {
if(root == nullptr) return 0;
int left = maxDepth(root->left);
int right = maxDepth(root->right);
int height = 1+max(left, right);
return height;
}
};
LeetCode 111.二叉树的最小深度
题目链接:111.二叉树的最小深度
踩坑:与求解二叉树的最大深度相比,并不是将返回值由max变为min就简单解决了的
思路:求解最小深度的核心就是对叶节点的判断,如果是将求最大深度代码的max改为min,意味着如果当前节点的一个子树为空,另一个不为空,那么该节点的高度会被认为是1,即被认为是叶节点。所以,应该对两个子树的不同情况做不同处理。PS:这道题同样也是可以用层序遍历可以解决滴,也是在遍历过程中发现当前节点的两个子树都为空,返回当前层数即可。
代码:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
int minDepth(TreeNode* root) {
if(root == nullptr) return 0;
int left = minDepth(root->left);
int right = minDepth(root->right);
if(left == 0 || right == 0) return 1+left+right;
else return 1+min(left, right);
}
};
LeetCode 222.完全二叉树的节点个数
题目链接:222.完全二叉树的节点个数
踩坑:先看了视频,无坑
思路:随便使用任意一种遍历都可以解决这道题,但是这样就相当于忽视了完全二叉树这一特性。对于完全二叉树来说,其中必定存在一个满二叉子树,而满二叉树的节点个数可以直接使用 2 n − 1 2^n-1 2n−1求得。所以可以尝试确定完全二叉树中的满二叉树。在完全二叉树中,给定一个根节点,判断其是否为满二叉树可以通过不断向左延申和向右延申,如果左右深度相等说明是满二叉树,此时根节点可以直接根据深度返回节点个数。
代码:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
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;
return countNodes(root->left)+countNodes(root->right)+1;
}
};