代码随想录刷题day17
110.平衡二叉树
给定一个二叉树,判断它是否是高度平衡的二叉树。
本题中,一棵高度平衡二叉树定义为:
一个二叉树每个节点的左右两个子树的高度差的绝对值不超过 1 。
示例:
一个高度平衡二叉树是每个节点的左右两个子树的高度差的绝对值不超过 1 ,所以递归向上返回的过程中如果已经不是平衡二叉树了,就直接返回-1,用来标记不是平衡二叉树,就不用再返回高度了。
最终函数的返回值要么是-1,return false;
要么返回根节点的高度,return true。
class Solution {
public:
int getHeight(TreeNode* node){
if(node == nullptr) return 0;//节点为空,高度为0
int leftHeight = getHeight(node->left);
if(leftHeight == -1) return -1;//如果左子树已经不是平衡二叉树,返回-1
int rightHeight = getHeight(node->right);
if(rightHeight == -1) return -1;//如果右子树已经不是平衡二叉树,返回-1
if(abs(leftHeight - rightHeight) > 1)//如果中间节点不是平衡二叉树,返回-1
return -1;
else
return 1 + max(leftHeight, rightHeight);//否则返回中间节点的高度
}
bool isBalanced(TreeNode* root) {
//如果返回值是-1,说明不是平衡二叉树,返回false;否则返回true
return getHeight(root) == -1 ? false : true;
}
};
257.二叉树的所有路径
给你一个二叉树的根节点 root ,按任意顺序 ,返回所有从根节点到叶子节点的路径。
示例 1:
输入:root = [1,2,3,null,5]
输出:[“1->2->5”,“1->3”]
示例 2:
输入:root = [1]
输出:[“1”]
第一次接触回溯算法,有点懵,照猫画虎写完了
这里是解析
class Solution {
public:
void travasal(TreeNode* node, vector<int>& path, vector<string>& res){
path.push_back(node->val);
if(node->left == nullptr && node->right == nullptr){
//到叶子节点,把这条路径加入到结果集中
string sPath;
for(int i = 0; i < path.size() - 1; i++){
sPath += to_string(path[i]);
sPath += "->";
}
sPath += to_string(path[path.size() - 1]);
res.push_back(sPath);
return;
}
if(node->left){
travasal(node->left, path, res);
path.pop_back();
}
if(node->right){
travasal(node->right, path, res);
path.pop_back();
}
}
vector<string> binaryTreePaths(TreeNode* root) {
vector<string> res;
vector<int> path;
if(root == nullptr) return res;
travasal(root, path, res);
return res;
}
};
404.左叶子之和
给定二叉树的根节点 root ,返回所有左叶子之和。
示例:
输入: root = [3,9,20,null,null,15,7]
输出: 24
解释: 在这个二叉树中,有两个左叶子,分别是 9 和 15,所以返回 24。
判断当前节点是不是左叶子是无法判断的,必须要通过节点的父节点来判断
节点A的左孩子不为空,且左孩子的左右孩子都为空(说明是叶子节点),那么A节点的左孩子为左叶子节点
所以传入的节点是叶子节点的父节点
前序遍历,中左右,先判断根节点是否有左叶子节点,有就加起来;然后递归遍历左右子树,最终返回左叶子之和。
class Solution {
public:
int sumOfLeftLeaves(TreeNode* root) {
if(root == nullptr) return 0;
if(root->left == nullptr && root->right == nullptr) return 0;
int sum = 0;
//如果是左叶子节点
if(root->left && root->left->left == nullptr && root->left->right == nullptr)
sum += root->left->val;
sum += sumOfLeftLeaves(root->left);
sum += sumOfLeftLeaves(root->right);
return sum;
}
};