Day 17 二叉树:平衡二叉树、二叉树的所有路径、左叶子之和
今日解题只有递归【快速复习】
力扣相关例题
110. 平衡二叉树
给定一个二叉树,判断它是否是高度平衡的二叉树。
本题中,一棵高度平衡二叉树定义为:
一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。
示例 :
输入:root = [3,9,20,null,null,15,7]
输出:true
class Solution {
public:
int getheight(TreeNode* node) {
if (node == NULL) {
return 0;
}
//左
int lefttree = getheight(node->left);
//若左子树高度差大于1,则返回-1
if (lefttree == -1) {
return -1;
}
//右
int righttree = getheight(node->right);
//若右子树高度差大于1.则返回-1
if (righttree == -1) {
return -1;
}
//中
int result;
//判断左右孩子高度差是否大于1
if (abs(lefttree - righttree) > 1) {
return -1;
} else {
result = 1 + max(lefttree, righttree);
}
return result;
}
bool isBalanced(TreeNode* root) {
//若返回高度差==1,则为false
return getheight(root) == -1 ? false : true;
}
};
257. 二叉树的所有路径
给你一个二叉树的根节点 root ,按 任意顺序 ,返回所有从根节点到叶子节点的路径。
叶子节点 是指没有子节点的节点。
示例 1:
输入:root = [1,2,3,null,5]
输出:[“1->2->5”,“1->3”]
class Solution {
public:
void traveltree(TreeNode* node, vector<int>& path, vector<string>& result) {
path.push_back(node->val);
//若左右孩子都为空,则是叶子节点,则将路径写入result
if (node->left == NULL && node->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 (node->left) {
traveltree(node->left, path, result);
//回溯
path.pop_back();
}
if (node->right) {
traveltree(node->right, path, result);
//回溯
path.pop_back();
}
}
vector<string> binaryTreePaths(TreeNode* root) {
vector<int> path;
vector<string> result;
if (root == NULL) {
return result;
}
traveltree(root, path, result);
return result;
}
};
404. 左叶子之和
给定二叉树的根节点 root ,返回所有左叶子之和。
示例 1:
输入: root = [3,9,20,null,null,15,7]
输出: 24
解释: 在这个二叉树中,有两个左叶子,分别是 9 和 15,所以返回 24
class Solution {
public:
int sumOfLeftLeaves(TreeNode* root) {
if (root == NULL) {
return 0;
}
if (root->left == NULL && root->right == NULL) {
return 0;
}
//左子树左叶子之和
int lefttree = sumOfLeftLeaves(root->left);
if (root->left != NULL && root->left->left == NULL && root->left->right == NULL) {
lefttree = root->left->val;
}
//右子树左叶子之和
int righttree = sumOfLeftLeaves(root->right);
int result = lefttree + righttree;
return result;
}
};