虽然今天是2月17日
昨天偷懒了……
● 104.二叉树的最大深度 559.n叉树的最大深度
● 111.二叉树的最小深度
● 222.完全二叉树的节点个数
104. 二叉树的最大深度
迭代就不说了,层序遍历前天写了
以前还真没区分过深度和高度……直接看视频
总之:
高度:从下往上,后序遍历(子结点把高度返回给父结点)
深度:从上往下,先序遍历(往下遍历一个就+1)
根节点的高度就是二叉树的最大深度(很好理解)
class Solution {
int rootHeight(TreeNode* root) {
if(root == nullptr) return 0;
int left = rootHeight(root->left);
int right = rootHeight(root->right);
return max(left, right) + 1;
}
public:
int maxDepth(TreeNode* root) {
return rootHeight(root);
}
};
559. n叉树最大深度
多一层循环而已
class Solution {
int rootHeight(Node* root) {
if(root == nullptr) return 0;
int maxChildren = 0;
for(Node* node : root->children) {
maxChildren = max(maxChildren, rootHeight(node));
}
return maxChildren + 1;
}
public:
int maxDepth(Node* root) {
return rootHeight(root);
}
};
111. 二叉树的最小深度
首先明确最小深度:
根节点到叶子节点的最小距离
那明白了这个就简单了,也就是求最小叶子节点的高度
但是需要注意判断下左右子树,要同时为空才能返回 min(left, right)
class Solution {
int rootHeight(TreeNode* root) {
if(root == nullptr) return 0;
int left = rootHeight(root->left);
int right = rootHeight(root->right);
if(root->left == nullptr) return right + 1;
if(root->right == nullptr) return left + 1;
return min(left, right) + 1;
}
public:
int minDepth(TreeNode* root) {
return rootHeight(root);
}
};
222. 完全二叉树的结点个数
如果是普通二叉树那就直接遍历
class Solution {
int postorder(TreeNode* node) {
if(node == nullptr) return 0;
int left = preorder(node->left);
int right = preorder(node->right);
return left + right + 1;
}
public:
int countNodes(TreeNode* root) {
return postorder(root);
}
};
对于完全二叉树,众所周知完全二叉树叶子结点那一层从左到右是满的(连续的,不能断)
我们判断的办法是
左满二叉树 + 右满二叉树,现在问题是如何判断满二叉树
即:向左遍历和向右遍历深度相等,仅遍历某子树左右两侧的结点
思路容易理解,代码直接看视频…
感觉学到了
class Solution {
int getNodesSum(TreeNode* node) {
if(node == nullptr) return 0;
auto left = node->left;
auto right = node->right;
int leftDepth = 0, rightDepth = 0;
while(left != nullptr) {
left = left->left;
leftDepth++;
}
while(right != nullptr) {
right = right->right;
rightDepth++;
}
if(leftDepth == rightDepth) {
return (2 << leftDepth) - 1;
}
int lnum = getNodesSum(node->left);
int rnum = getNodesSum(node->right);
return lnum + rnum + 1;
}
public:
int countNodes(TreeNode* root) {
return getNodesSum(root);
}
};