简单
给定一个二叉树,判断它是否是高度平衡的二叉树。
本题中,一棵高度平衡二叉树定义为:
一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 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
提示:
func isBalanced(root *TreeNode) bool {
if root == nil {
return true
}
_, flag := dfs_isBalanced(root)
return flag
}
func dfs_isBalanced(root *TreeNode) (int, bool) {
if root == nil {
return 0, true
}
// 获取左右子树的高度和平衡信息
l, l_flag := dfs_isBalanced(root.Left)
r, r_flag := dfs_isBalanced(root.Right)
// 检查当前子树是否平衡
if !l_flag || !r_flag || abs(l-r) > 1 {
return max(l, r) + 1, false
}
// 返回当前子树的高度
return max(l, r) + 1, true
}
func abs(x int) int {
if x < 0 {
return -x
}
return x
}
func max(a, b int) int {
if a > b {
return a
}
return b
}
简单
给你一个二叉树的根节点 root ,按 任意顺序 ,返回所有从根节点到叶子节点的路径。
叶子节点 是指没有子节点的节点。
示例 1:
[图片]
输入:root = [1,2,3,null,5]
输出:[“1->2->5”,“1->3”]
示例 2:
输入:root = [1]
输出:[“1”]
提示:
func binaryTreePaths(root *TreeNode) []string {
res := make([]string, 0)
temp := make([]int, 0)
binaryTreePaths_dfs(root, temp, &res)
return res
}
func binaryTreePaths_dfs(root *TreeNode, s []int, res *[]string) {
if root == nil {
return
}
s = append(s, root.Val)
if root.Left == nil && root.Right == nil {
// 只有在叶子节点时将路径添加到结果
path := strings.Trim(strings.Join(strings.Fields(fmt.Sprint(s)), "->"), " ")
path = strings.Trim(path, "[")
path = strings.Trim(path, "]")
*res = append(*res, path)
}
binaryTreePaths_dfs(root.Left, s, res)
binaryTreePaths_dfs(root.Right, s, res)
}
var res []string //不安全,学习上面的方法
func binaryTreePaths(root *TreeNode) []string {
res=make([]string,0)
tmp := ""
dfs_BTP(root, tmp)
return res
}
func dfs_BTP(root *TreeNode, tmp string) {
if root == nil {
return
}
if len(tmp)==0{
tmp = tmp + strconv.Itoa(root.Val)
}else{
tmp = tmp + "->" + strconv.Itoa(root.Val)
}
if root.Left == nil && root.Right == nil {
res = append(res, tmp)
}
dfs_BTP(root.Left, tmp)
dfs_BTP(root.Right, tmp)
return
}
简单
给定二叉树的根节点 root ,返回所有左叶子之和。
示例 1:
[图片]
输入: root = [3,9,20,null,null,15,7]
输出: 24
解释: 在这个二叉树中,有两个左叶子,分别是 9 和 15,所以返回 24
示例 2:
输入: root = [1]
输出: 0
提示:
func sumOfLeftLeaves(root *TreeNode) int {
if root == nil {
return 0
}
//左子树
left := sumOfLeftLeaves(root.Left)
//没有左子树,就是左叶子节点
if root.Left != nil && root.Left.Left == nil && root.Left.Right == nil {
left = root.Left.Val
}
//右子树的左叶子节点
right := sumOfLeftLeaves(root.Right)
return left + right
}