LeetCode110 平衡二叉树
题目:
给定一个二叉树,判断它是否是高度平衡的二叉树。
本题中,一棵高度平衡二叉树定义为:
一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 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.
* public class TreeNode {
* public int val;
* public TreeNode left;
* public TreeNode right;
* public TreeNode(int val=0, TreeNode left=null, TreeNode right=null) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
//递归(DFS)
public class Solution {
public bool IsBalanced(TreeNode root) {
return DFS(root) == -1 ? false : true;
}
public int DFS(TreeNode root)
{
if (root == null) return 0;
int leftheight = DFS(root.left);
if (leftheight == -1) return -1;
int rightheight = DFS(root.right);
if (rightheight == -1) return -1;
int res;
if (Math.Abs(leftheight - rightheight) > 1)
{
res = -1;
}
else
{
res = 1 + Math.Max(leftheight, rightheight);
}
return res;
}
}
LeetCode257 二叉树的所有路径
题目:
给你一个二叉树的根节点 root ,按 任意顺序 ,返回所有从根节点到叶子节点的路径。
叶子节点 是指没有子节点的节点。
示例 1:
输入:root = [1,2,3,null,5]
输出:[“1->2->5”,“1->3”]
示例 2:
输入:root = [1]
输出:[“1”]
思路:
代码:
//DFS
public class Solution {
public IList<string> BinaryTreePaths(TreeNode root) {
IList<string> list = new List<string>();
if (root == null) return list;
Traversal(root, "", list);
return list;
}
public void Traversal(TreeNode root, string s, IList<string> res)
{
if (root != null)
{
StringBuilder str = new StringBuilder(s);
str.Append(root.val);
if (root.left == null && root.right == null)
{
res.Add(str.ToString());
}
else
{
str.Append("->");
Traversal(root.left, str.ToString(), res);
Traversal(root.right, str.ToString(), res);
}
}
}
}
LeetCode404 左叶子之和
题目:
给定二叉树的根节点 root ,返回所有左叶子之和。
示例 1:
输入: root = [3,9,20,null,null,15,7]
输出: 24
解释: 在这个二叉树中,有两个左叶子,分别是 9 和 15,所以返回 24
示例 2:
输入: root = [1]
输出: 0
代码:
public class Solution {
public int SumOfLeftLeaves(TreeNode root) {
if (root == null) return 0;
int leftVal = SumOfLeftLeaves(root.left);//左
int rightVal = SumOfLeftLeaves(root.right);//右
int midVal = 0;
if (root.left != null && root.left.left == null && root.left.right == null)
{
midVal = root.left.val;
}
int sum = midVal + leftVal + rightVal;//中
return sum;
}
}