好像不知不觉就到了回溯的部分了,也就是从上往下遍历的时候,退后上一级时需要注意参数的变化,注意参数也要退回到上一层才可以。
110.平衡二叉树
平衡二叉树
虽然说是判断深度,但是代码随想录还是从高度出发,因此依旧是后序遍历。
而且后续遍历自我感觉就是适用于从下网上进行比较的,特别适合这种需要进行对比的。
func isBalanced(root *TreeNode) bool {
if GetHeight(root) == -1 { return false}
return true
}
func GetHeight(root *TreeNode) int{
if root == nil {return 0}
lefthegiht := GetHeight((*root).Left)
if lefthegiht == -1 {return -1}
rightheight := GetHeight((*root).Right)
if rightheight == -1{return -1}
num := lefthegiht - rightheight
if int(math.Abs(float64(num))) > 1 {return -1}
return int(math.Max(float64(lefthegiht),float64(rightheight))) + 1
}
257. 二叉树的所有路径
二叉树的所有路径
路径就是从上往下寻找,到了最后叶子节点的地方就停下,记录一整条路径。
因为是从上往下遍历,所以采用前序遍历的方式(感觉从下往上就是后序)。难顶的是写的时候不知道可以直接用go的方式将int转为string,然后用 + 进行拼接
strconv.Itoa(node.Val)+"->" //先将int转为string,然后用+进行拼接
func binaryTreePaths(root *TreeNode) []string {
ret := make([]string, 0)
single := make([]byte,0)
//single = append(single, byte((*root).Val + '0'))
dfs(root, single, &ret)
return ret
}
func dfs(root *TreeNode, single []byte, ret *[]string){
single = append(single, '-')
single = append(single, '>')
tmp := (*root).Val
if (*root).Val < 0 {
single = append(single, '-')
tmp *= -1
}
ins := make([]byte, 0)
for tmp > 0{
ins = append(ins, byte(tmp %10 + '0'))
tmp /= 10
}
for i := len(ins) - 1; i >= 0 ;i--{
single = append(single, ins[i])
}
if (*root).Left == nil && (*root).Right == nil{
*ret = append(*ret, string(single[2:]))
}
if (*root).Left != nil{
dfs((*root).Left, single, ret)
}
if (*root).Right != nil{
dfs((*root).Right, single, ret)
}
}
404.左叶子之和
左叶子之和
这道题是求所有左叶子节点的值,所以需要判断是否是叶子节点,然后返回其左值。
比较绕的一道题,需要好好看看才可以。
func sumOfLeftLeaves(root *TreeNode) int {
if root == nil {return 0}
if (*root).Left == nil && (*root).Right == nil{return 0}
leftsum := sumOfLeftLeaves((*root).Left)
if (*root).Left != nil && (*((*root).Left)).Left == nil && (*((*root).Left)).Right == nil{
leftsum = (*((*root).Left)).Val
}
Rightsum := sumOfLeftLeaves((*root).Right)
return leftsum + Rightsum
}