leetcode 110.平衡二叉树
题目链接:110. 平衡二叉树 - 力扣(LeetCode)
视频链接:后序遍历求高度,高度判断是否平衡 | LeetCode:110.平衡二叉树_哔哩哔哩_bilibili
思路
平衡二叉树定义为:一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。
本题就是求左右子树的高度差,如果差值<=1,就是平衡二叉树了。这道题可以和求二叉树深度的题对比一下,这样印象会更深刻一些。求高度用后序,求深度用前序。因为高度是从下到上去查,所以要左右中的依次往上遍历,而求深度是从上到下去查,所以先中间,再左右,要中左右依次往下遍历。
代码实现
class Solution {
public:
int getHeight(TreeNode* node) {
if (node == NULL) {
return 0;
}
int leftHeight = getHeight(node->left);
if (leftHeight == -1) return -1;
int rightHeight = getHeight(node->right);
if (rightHeight == -1) return -1;
return abs(leftHeight - rightHeight) > 1 ? -1 : 1 + max(leftHeight, rightHeight);
}
bool isBalanced(TreeNode* root) {
return getHeight(root) == -1 ? false : true;
}
};
leetcode 257.二叉树的所有路径
题目链接:257. 二叉树的所有路径 - 力扣(LeetCode)
视频链接:递归中带着回溯,你感受到了没?| LeetCode:257. 二叉树的所有路径_哔哩哔哩_bilibili
思路
这道题需要找路径,自然是从上往下找,所以说要用前序(中左右),但是这道题也需要用到回溯,要知道回溯递归是一家。如图所示:
使用vector结构的path容器来记录路径是为了方便回溯。
代码实现
class Solution {
private:
void traversal(TreeNode* cur, vector<int>& path, vector<string>& result) {
path.push_back(cur->val); // 中,中为什么写在这里,因为最后一个节点也要加入到path中
// 这才到了叶子节点
if (cur->left == NULL && cur->right == NULL) {
string sPath;
for (int i = 0; i < path.size() - 1; i++) {
sPath += to_string(path[i]);
sPath += "->";
}
sPath += to_string(path[path.size() - 1]);
result.push_back(sPath);
return;
}
if (cur->left) { // 左
traversal(cur->left, path, result);
path.pop_back(); // 回溯
}
if (cur->right) { // 右
traversal(cur->right, path, result);
path.pop_back(); // 回溯
}
}
public:
vector<string> binaryTreePaths(TreeNode* root) {
vector<string> result;
vector<int> path;
if (root == NULL) return result;
traversal(root, path, result);
return result;
}
};
leetcode 404.左叶子之和
题目链接:404. 左叶子之和 - 力扣(LeetCode)
视频链接:二叉树的题目中,总有一些规则让你找不到北 | LeetCode:404.左叶子之和_哔哩哔哩_bilibili
思路
·首先要注意是判断左叶子,不是二叉树左侧节点,所以不要上来想着层序遍历。
例如:这棵二叉树左叶子之和为0
如图:这棵二叉树左叶子之和为21
所以左叶子的定义为:节点A的左孩子不为空,且左孩子的左右孩子都为空(说明是叶子节点),那么A节点的左孩子为左叶子节点。(把上图的‘9’当作节点A,更有助于理解)文章来源:https://www.toymoban.com/news/detail-671127.html
需要注意的是,想要判断子节点是不是左叶子,必须是遍历到父节点的时候才能判断!文章来源地址https://www.toymoban.com/news/detail-671127.html
代码实现
class Solution {
public:
int sumOfLeftLeaves(TreeNode* root) {
if (root == NULL) return 0;
if (root->left == NULL && root->right== NULL) return 0;
int leftValue = sumOfLeftLeaves(root->left);
if (root->left && !root->left->left && !root->left->right) {
leftValue = root->left->val;
}
int rightValue = sumOfLeftLeaves(root->right);
int sum = leftValue + rightValue; // 中
return sum;
}
};
到了这里,关于Day17|leetcode 110.平衡二叉树、257.二叉树的所有路径、404.左叶子之和的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!