110.平衡二叉树
力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
给定一个二叉树,判断它是否是高度平衡的二叉树。
本题中,一棵高度平衡二叉树定义为:
一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。
输入:root = [3,9,20,null,null,15,7] 输出:true
解题思路:
- 这道题考察的是节点的左右子树相差不能超过1。所以是比较高度,则从下到上开始进行计算。从高度1开始,向上返回1,表示我为高度1,如果不存在则返回0。这样不断向上累加,如果有一个节点的左边存在高度,比如3,右边高度为0,则相减比较,返回其值,大于1则表示该节点左右子树已经不满足条件,返回-1,从而使计算的绝对值始终大于1,从到顶点时也返回-1。
递归法:
public class Solution {
public bool IsBalanced(TreeNode root) {
if(GetHeight(root) == -1) return false;
else return true;
}
public int GetHeight(TreeNode root){
if(root == null) return 0;
int leftHeight = GetHeight(root.left);
if(leftHeight == -1) return -1;
int rightHeight = GetHeight(root.right);
if(rightHeight == -1) return -1;
return Math.Abs(leftHeight - rightHeight) >1? -1:1+Math.Max(leftHeight,rightHeight);
}
}
257.二叉树的所有路径
力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
给你一个二叉树的根节点 root
,按 任意顺序 ,返回所有从根节点到叶子节点的路径。
叶子节点 是指没有子节点的节点。
输入:root = [1,2,3,null,5] 输出:["1->2->5","1->3"]
解题思路:
- 选择前序递归。重点是当某个节点的左右子节点都为空的时候,我们开始收集路径。这里采用了列表来收集。每当遍历一个节点,就将该节点的值添加到列表中。通过StringBuilder将路径转化为字符串。
递归法:
public class Solution {
public IList<string> BinaryTreePaths(TreeNode root) {
//用来接收最后的字符串表
IList<string> res = new List<string>();
if(root == null) return res;
//用来接收整型数字
IList<int> path = new List<int>();
Traversal(root,path,res);
return res;
}
public void Traversal(TreeNode root,IList<int> path,IList<string> res){
//前序遍历,所以先处理中节点
path.Add(root.val);
//先思考终止条件,当左,右子节点皆为空时进行路径处理
if(root.left == null && root.right == null){
//TODO
//先把路径顺序z转化为字符串
StringBuilder sb = new StringBuilder();
for(int i = 0;i < path.Count-1;i++){
sb.Append(path[i]).Append("->");
}
sb.Append(path[path.Count-1]);//一个完整的路径产生
res.Add(sb.ToString());
//return;//收集完一个路径后,返回上个函数体
}
//递归逻辑
if(root.left != null){
Traversal(root.left,path,res);
//当递归到一轮函数终点时,最外层函数结束,程序执行回到前一层,这时回溯path收集的val
//path.RemoveAt(path.Count -1);
}
if(root.right != null){
Traversal(root.right,path,res);
//path.RemoveAt(path.Count-1);
}
path.RemoveAt(path.Count -1);
}
}
404.左叶子之和
力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
给定二叉树的根节点 root
,返回所有左叶子之和。
输入: root = [3,9,20,null,null,15,7] 输出: 24 解释: 在这个二叉树中,有两个左叶子,分别是 9 和 15,所以返回 24
解题思路:
- 前序递归遍历。当节点的左节点不为空,且左节点的左节点和右节点为空时,说明该节点的左节点为左叶子,进行相加。
递归法:
public class Solution {
int sum = 0;
public int SumOfLeftLeaves(TreeNode root) {
if(root == null) return sum;
if(root.left == null && root.right == null) return sum;
GetSum(root);
return sum;
}
public void GetSum(TreeNode root){
if(root == null) return ;
if(root.left != null && root.left.left == null && root.left.right == null){
sum+=root.left.val;
}
GetSum(root.left);
GetSum(root.right);
}
}