110.平衡二叉树
题目
给定一个二叉树,判断它是否是高度平衡的二叉树。
本题中,一棵高度平衡二叉树定义为:
一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。
示例 1:
输入:root = [3,9,20,null,null,15,7]
输出:true
示例 2:
输入:root = [1,2,2,3,3,null,null,4,4]
输出:false
示例 3:
输入:root = []
输出:true
题解
/**
* 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:
//左右中[返回-1表示已经不是平衡二叉树了,否则返回的是二叉树的高度]
int getHight(TreeNode* node){
if(node == nullptr) return 0; //到达叶子节点的左右孩子,返回高度为0
int leftHigh = getHight(node->left);
if(leftHigh == -1) return -1;
int rightHigh = getHight(node ->right);
if(rightHigh == -1) return -1;
if(abs(leftHigh - rightHigh) > 1){
return -1;
}
return 1 + max(leftHigh,rightHigh);
}
bool isBalanced(TreeNode* root) {
//求高度,用后序遍历
int result = getHight(root);
if(result == -1) return false;
return true;
}
};
257.二叉树的所有路径
题目
给你一个二叉树的根节点 root ,按 任意顺序 ,返回所有从根节点到叶子节点的路径。
叶子节点 是指没有子节点的节点。
示例 1:
输入:root = [1,2,3,null,5]
输出:[“1->2->5”,“1->3”]
示例 2:
输入:root = [1]
输出:[“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:
//这里的返回值为void,因为只用记录就好,其他路径不需要指定当前路径
void traversal(TreeNode* node,vector<string> &result,vector<int> &path){
path.push_back(node ->val); //写在递归终止之前,是因为最后一个节点也要加入路径
//递归终止条件
if(node->left == nullptr && node->right == nullptr){
//开始加入路径
string spath;
for(int i = 0;i < path.size() - 1;i++){ //为了格式话输出,最后一个叶子节点在外面加入path
spath += to_string(path[i]);
spath += "->";
}
spath += to_string(path[path.size() - 1]);
result.push_back(spath);
return; //回溯
}
if(node -> left){
traversal(node->left,result,path);
path.pop_back(); //递归完要进行回溯
}
if(node -> right){
traversal(node->right,result,path);
path.pop_back();
}
}
vector<string> binaryTreePaths(TreeNode* root) {
//要从根节点 到 叶子节点的路径,所以用前序遍历
vector<int> path;
vector<string> result;
traversal(root,result,path);
return result;
}
};
404.左叶子之和
题目
给定二叉树的根节点 root ,返回所有左叶子之和。
示例 1:
输入: root = [3,9,20,null,null,15,7]
输出: 24
解释: 在这个二叉树中,有两个左叶子,分别是 9 和 15,所以返回 24
示例 2:
输入: root = [1]
输出: 0
题解
/**
* 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 sum = 0;
int sumOfLeftLeaves(TreeNode* root) {
//一个节点本身并不能判断是不是左叶子,要通过父节点来判断
//父节点的左孩子不为空,且左孩子的左右孩子都为空时,父节点的左孩子为左叶子节点
//直接遍历,判断每个节点是否为做叶子,是的话直接加和
if(root == nullptr) return 0;
//中
if(root -> left != nullptr && !root->left->right && !root->left->left){
sum += root->left->val;
}
//左
sumOfLeftLeaves(root->left);
//右
sumOfLeftLeaves(root->right);
return sum;
}
};