目录

golang算法二叉树递归

golang算法二叉树递归

104. 二叉树的最大深度

给定一个二叉树 root ,返回其最大深度。

二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。

示例 1:

https://i-blog.csdnimg.cn/direct/664a087cfb8547aea018b257d1f20ae1.png

输入:root = [3,9,20,null,null,15,7]

输出:3

示例 2:

输入:root = [1,null,2]

输出:2

提示:

树中节点的数量在 [0, 104] 区间内。

-100 <= Node.val <= 100

自底向上

/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */
func maxDepth(root *TreeNode) int {
    if root==nil{
        return 0
    }
    return max(maxDepth(root.Left),maxDepth(root.Right))+1
}

自顶向下

/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */
func maxDepth(root *TreeNode) int {
    ans:=0
    var dfs func(*TreeNode,int)
    dfs=func(node *TreeNode,depth int){
        if node==nil{
            return
        }
        ans=max(ans,depth+1)
        dfs(node.Left,depth+1)
        dfs(node.Right,depth+1)
    }
    dfs(root,0)
    return ans
}

112. 路径总和

给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum 。如果存在,返回 true ;否则,返回 false 。

叶子节点 是指没有子节点的节点。

示例 1:

https://i-blog.csdnimg.cn/direct/daf8c9a343d34d6da85a0ae6c417c0fb.png

输入:root = [5,4,8,11,null,13,4,7,2,null,null,null,1], targetSum = 22

输出:true

解释:等于目标和的根节点到叶节点路径如上图所示。

示例 2:

https://i-blog.csdnimg.cn/direct/42a36675b37e48b2843cb9d8289a5742.png

输入:root = [1,2,3], targetSum = 5

输出:false

解释:树中存在两条根节点到叶子节点的路径:

(1 –> 2): 和为 3

(1 –> 3): 和为 4

不存在 sum = 5 的根节点到叶子节点的路径。

示例 3:

输入:root = [], targetSum = 0

输出:false

解释:由于树是空的,所以不存在根节点到叶子节点的路径。

提示:

树中节点的数目在范围 [0, 5000] 内

-1000 <= Node.val <= 1000

-1000 <= targetSum <= 1000

自顶向下

/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */

func hasPathSum(root *TreeNode, targetSum int) bool {
    var dfs func(*TreeNode,int)
    result:=false
    dfs=func(root *TreeNode,sum int){
        if root==nil||result==true{
            return
        }
        if root.Val+sum==targetSum&&root.Left==nil&&root.Right==nil{
            result=true
        }else{
            dfs(root.Left,sum+root.Val)
            dfs(root.Right,sum+root.Val)
        }
    }
    dfs(root,0)
    return result
}

自底向上

/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */

func hasPathSum(root *TreeNode, targetSum int) bool {
    if root==nil{
        return false
    }
    targetSum-=root.Val
    if root.Left==root.Right{
        return targetSum==0
    }
    return hasPathSum(root.Left,targetSum)||hasPathSum(root.Right,targetSum)
}

129. 求根节点到叶节点数字之和

给你一个二叉树的根节点 root ,树中每个节点都存放有一个 0 到 9 之间的数字。

每条从根节点到叶节点的路径都代表一个数字:

例如,从根节点到叶节点的路径 1 -> 2 -> 3 表示数字 123 。

计算从根节点到叶节点生成的 所有数字之和 。

叶节点 是指没有子节点的节点。

示例 1:

https://i-blog.csdnimg.cn/direct/3d34b24a0a4740a88e3f506744ee3302.png

输入:root = [1,2,3]

输出:25

解释:

从根到叶子节点路径 1->2 代表数字 12

从根到叶子节点路径 1->3 代表数字 13

因此,数字总和 = 12 + 13 = 25

示例 2:

https://i-blog.csdnimg.cn/direct/6330a71bf2c648f38a5c8d7601626cea.png

输入:root = [4,9,0,5,1]

输出:1026

解释:

从根到叶子节点路径 4->9->5 代表数字 495

从根到叶子节点路径 4->9->1 代表数字 491

从根到叶子节点路径 4->0 代表数字 40

因此,数字总和 = 495 + 491 + 40 = 1026

提示:

树中节点的数目在范围 [1, 1000] 内

0 <= Node.val <= 9

树的深度不超过 10

/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */
func sumNumbers(root *TreeNode) int {
    ans:=0
    var dfs func(*TreeNode,int)
    dfs=func(node *TreeNode,x int){
        if node==nil{
            return
        }
        x=x*10+node.Val
        if node.Left==node.Right{
            ans+=x
            return
        }
        dfs(node.Left,x)
        dfs(node.Right,x)
    }
    dfs(root,0)
    return ans
}
/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */
func getSum(root *TreeNode,sum int)int{
    if root==nil{
        return 0
    }
    sum=sum*10+root.Val
    if root.Left==root.Right{
        return sum
    }
    return getSum(root.Left,sum)+getSum(root.Right,sum)
}
func sumNumbers(root *TreeNode) int {
    
    return getSum(root,0)
}

1448. 统计二叉树中好节点的数目

给你一棵根为 root 的二叉树,请你返回二叉树中好节点的数目。

「好节点」X 定义为:从根到该节点 X 所经过的节点中,没有任何节点的值大于 X 的值。

示例 1:

https://i-blog.csdnimg.cn/direct/e41daaa9e61e469daf21df763e107361.png

输入:root = [3,1,4,3,null,1,5]

输出:4

解释:图中蓝色节点为好节点。

根节点 (3) 永远是个好节点。

节点 4 -> (3,4) 是路径中的最大值。

节点 5 -> (3,4,5) 是路径中的最大值。

节点 3 -> (3,1,3) 是路径中的最大值。

示例 2:

https://i-blog.csdnimg.cn/direct/c9d70aeda1694a778ba086912bf16ed9.png

输入:root = [3,3,null,4,2]

输出:3

解释:节点 2 -> (3, 3, 2) 不是好节点,因为 “3” 比它大。

示例 3:

输入:root = [1]

输出:1

解释:根节点是好节点。

提示:

二叉树中节点数目范围是 [1, 10^5] 。

每个节点权值的范围是 [-10^4, 10^4] 。

/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */
func getGood(root *TreeNode,num int)int{
    if root==nil{
        return 0
    }
    if root.Val>=num{
        return getGood(root.Left,max(num,root.Val))+getGood(root.Right,max(num,root.Val))+1
    }else{
        return getGood(root.Left,max(num,root.Val))+getGood(root.Right,max(num,root.Val))

    }
}
func goodNodes(root *TreeNode) int {
    return getGood(root,math.MinInt)
}

987. 二叉树的垂序遍历🪝

给你二叉树的根结点 root ,请你设计算法计算二叉树的 垂序遍历 序列。

对位于 (row, col) 的每个结点而言,其左右子结点分别位于 (row + 1, col - 1) 和 (row + 1, col + 1) 。树的根结点位于 (0, 0) 。

二叉树的 垂序遍历 从最左边的列开始直到最右边的列结束,按列索引每一列上的所有结点,形成一个按出现位置从上到下排序的有序列表。如果同行同列上有多个结点,则按结点的值从小到大进行排序。

返回二叉树的 垂序遍历 序列。

示例 1:

https://i-blog.csdnimg.cn/direct/abda2b9c207b4593b54fb87f2d936b16.png

输入:root = [3,9,20,null,null,15,7]

输出:[[9],[3,15],[20],[7]]

解释:

列 -1 :只有结点 9 在此列中。

列 0 :只有结点 3 和 15 在此列中,按从上到下顺序。

列 1 :只有结点 20 在此列中。

列 2 :只有结点 7 在此列中。

示例 2:

https://i-blog.csdnimg.cn/direct/9a5f9297389f48458f01233b0114f9e4.png

输入:root = [1,2,3,4,5,6,7]

输出:[[4],[2],[1,5,6],[3],[7]]

解释:

列 -2 :只有结点 4 在此列中。

列 -1 :只有结点 2 在此列中。

列 0 :结点 1 、5 和 6 都在此列中。

1 在上面,所以它出现在前面。

5 和 6 位置都是 (2, 0) ,所以按值从小到大排序,5 在 6 的前面。

列 1 :只有结点 3 在此列中。

列 2 :只有结点 7 在此列中。

示例 3:

https://i-blog.csdnimg.cn/direct/4bd3f66e3efc426fb2d0f7d1a38de581.png

输入:root = [1,2,3,4,6,5,7]

输出:[[4],[2],[1,5,6],[3],[7]]

解释:

这个示例实际上与示例 2 完全相同,只是结点 5 和 6 在树中的位置发生了交换。

因为 5 和 6 的位置仍然相同,所以答案保持不变,仍然按值从小到大排序。

提示:

树中结点数目总数在范围 [1, 1000] 内

0 <= Node.val <= 1000