首页 > 编程语言 >代码随想录算法训练营第十八天 | 112. 路径总和,113. 路径总和ii ,106.从中序与后序遍历序列构造二叉树,105.从前序与中序遍历序列构造二叉树,513.找树左下角的值

代码随想录算法训练营第十八天 | 112. 路径总和,113. 路径总和ii ,106.从中序与后序遍历序列构造二叉树,105.从前序与中序遍历序列构造二叉树,513.找树左下角的值

时间:2024-02-18 15:24:18浏览次数:34  
标签:node 遍历 nil int dfs 二叉树 序列 root targetSum

 

513. 找树左下角的值

  已解答 中等  

相关标签

相关企业  

给定一个二叉树的 根节点 root,请找出该二叉树的 最底层 最左边 节点的值。

假设二叉树中至少有一个节点。

 

示例 1:

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

示例 2:

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

 

提示:

  • 二叉树的节点个数的范围是 [1,104]
  • -231 <= Node.val <= 231 - 1

 

 


func findBottomLeftValue(root *TreeNode) int { var res int var maxDepth int curDepth := 1 var dfs func(node *TreeNode) dfs = func(node *TreeNode) { if node.Left == nil && node.Right == nil { if curDepth > maxDepth { maxDepth = curDepth res = node.Val } } if node.Left != nil { curDepth++ dfs(node.Left) curDepth-- } if node.Right != nil { curDepth++ dfs(node.Right) curDepth-- } } dfs(root) return res }   func findBottomLeftValue(root *TreeNode) int { var dfs func(node *TreeNode) (int, int) dfs = func(node *TreeNode) (int, int) { if node.Left == nil && node.Right == nil { return 1, node.Val } var leftHeight, rightHeight, leftVal, rightVal int if node.Left != nil { leftHeight, leftVal = dfs(node.Left) } if node.Right != nil { rightHeight, rightVal = dfs(node.Right) } if leftHeight >= rightHeight { return leftHeight + 1, leftVal } return rightHeight + 1, rightVal } _, res := dfs(root) return res }

 

func findBottomLeftValueOne(root *TreeNode) int { bfs := []*TreeNode{root} var lastLeft int for len(bfs) > 0 { lastLeft = bfs[0].Val var nbfs []*TreeNode for _, v := range bfs { if v.Left != nil { nbfs = append(nbfs, v.Left) } if v.Right != nil { nbfs = append(nbfs, v.Right) } } bfs = nbfs } return lastLeft }  

 

106. 从中序与后序遍历序列构造二叉树

  已解答 中等  

相关标签

相关企业  

给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。

 

示例 1:

输入:inorder = [9,3,15,20,7], postorder = [9,15,7,20,3]
输出:[3,9,20,null,null,15,7]

示例 2:

输入:inorder = [-1], postorder = [-1]
输出:[-1]

 

提示:

  • 1 <= inorder.length <= 3000
  • postorder.length == inorder.length
  • -3000 <= inorder[i], postorder[i] <= 3000
  • inorder 和 postorder 都由 不同 的值组成
  • postorder 中每一个值都在 inorder 中
  • inorder 保证是树的中序遍历
  • postorder 保证是树的后序遍历

 


func buildTree(inorder []int, postorder []int) *TreeNode { if len(inorder) == 0 { return nil } //找到父结点 pVal := postorder[len(postorder)-1] parent := &TreeNode{Val: pVal} //中序中首结点的位置 var inorderPValPos int for i := 0; i < len(inorder); i++ { if inorder[i] == pVal { inorderPValPos = i break } } leftInorder := inorder[:inorderPValPos] rightInorder := inorder[inorderPValPos+1:] leftPostorder := postorder[:inorderPValPos] rightPostorder := postorder[inorderPValPos : len(postorder)-1] parent.Left = buildTree(leftInorder, leftPostorder) parent.Right = buildTree(rightInorder, rightPostorder) return parent }  

113. 路径总和 II

  已解答 中等  

相关标签

相关企业  

给你二叉树的根节点 root 和一个整数目标和 targetSum ,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。

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

 

示例 1:

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

示例 2:

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

示例 3:

输入:root = [1,2], targetSum = 0
输出:[]

 

提示:

  • 树中节点总数在范围 [0, 5000] 内
  • -1000 <= Node.val <= 1000
  • -1000 <= targetSum <= 1000

func pathSum(root *TreeNode, targetSum int) [][]int { var res [][]int if root == nil { return res } trace := []int{root.Val} var dfs func(node *TreeNode, targetSum int) dfs = func(node *TreeNode, targetSum int) { if node.Left == nil && node.Right == nil { if targetSum == 0 { //这里不能直接用trace , 因为数据地址是共享的,需要copy一份 res = append(res, append([]int{}, trace...)) } return } if node.Left != nil { trace = append(trace, node.Left.Val) dfs(node.Left, targetSum-node.Left.Val) trace = trace[:len(trace)-1] } if node.Right != nil { trace = append(trace, node.Right.Val) dfs(node.Right, targetSum-node.Right.Val) trace = trace[:len(trace)-1] } } dfs(root, targetSum-root.Val) return res }

 

112. 路径总和

  已解答 简单  

相关标签

相关企业  

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

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

 

示例 1:

输入:root = [5,4,8,11,null,13,4,7,2,null,null,null,1], targetSum = 22
输出:true
解释:等于目标和的根节点到叶节点路径如上图所示

 


 

func hasPathSum(root *TreeNode, targetSum int) bool { if root == nil { return false } var dfs func(node *TreeNode, targetSum int) bool dfs = func(node *TreeNode, targetSum int) bool { if node.Left == nil && node.Right == nil && targetSum == node.Val { return true } var leftPass, rightPass bool if node.Left != nil { leftPass = dfs(node.Left, targetSum-node.Val) } if node.Right != nil { rightPass = dfs(node.Right, targetSum-node.Val) } return leftPass || rightPass } return dfs(root, targetSum)

标签:node,遍历,nil,int,dfs,二叉树,序列,root,targetSum
From: https://www.cnblogs.com/suxinmian/p/18019353

相关文章

  • N叉树遍历模板
    N叉树(N-aryTree)的类型和代码模板与二叉树有些相似,但由于N叉树具有多个子节点,因此在遍历和节点定义上有所不同。以下是N叉树的类型和相应的代码模板:N叉树节点的定义:classNode:def__init__(self,val=None,children=None):self.val=valself.children......
  • 力扣 深度优先搜索 199. 二叉树的右视图
    /** *Definitionforabinarytreenode. *publicclassTreeNode{ *  intval; *  TreeNodeleft; *  TreeNoderight; *  TreeNode(){} *  TreeNode(intval){this.val=val;} *  TreeNode(intval,TreeNodeleft,Tr......
  • P2757 [国家集训队] 等差子序列
    题目的等差子序列最少只要求长度为3,那么其实就转化为对于一个数是否存在左右各一个与它差值相等的一对数,比如14325中1,5对3来说就如此。这样的关系放到数轴上就是是否存在一对数到某数的距离相等。由于题目明确是一个排列,也就是1到n所有数一定会出现一次,那么对于某数,它左边的......
  • P1439 【模板】最长公共子序列
    首先找最大公共子序列,可以轻松想到$O(n^2)$的dp转移式子,$f_{i,j}=max\begin{cases}f_{i-1,j}&i>0\f_{i,j-1}&j>0\f_{i-1,j-1}+1&i>0,j>0,A_i=A_j\end{cases}$但是我们发现最后$n\le10^5$所以$n^2$的复杂度不够优,这个时候再看题目,发现A,B都是 1~n的排列,由此可知A,B......
  • 代码随想录算法训练营第十七天 | 110.平衡二叉树 (优先掌握递归)| 404.左叶子之和 (优先
    257.二叉树的所有路径 已解答简单 相关标签相关企业 给你一个二叉树的根节点 root ,按 任意顺序 ,返回所有从根节点到叶子节点的路径。叶子节点 是指没有子节点的节点。示例1:输入:root=[1,2,3,null,5]输出:["1->2->5","1->3"]示例2:输入:ro......
  • 代码随想录算法训练营第十六天 | 104.二叉树的最大深度| 559.n叉树的最大深度|222.完
    222.完全二叉树的节点个数 已解答简单 相关标签相关企业 给你一棵 完全二叉树 的根节点 root ,求出该树的节点个数。完全二叉树 的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中......
  • 【常见问题】Java 8 date time type `java.time.LocalDateTime` not supported by def
    问题描述将一个包含LocalDateTime对象的集合进行序列化和反序列化时,可能会遇到以下异常:Causedby:com.fasterxml.jackson.databind.exc.InvalidDefinitionException:Java8date/timetype`java.time.LocalDate`notsupportedbydefault:addModule"com.fasterxml.jack......
  • 代码随想录算法训练营第十五天 | 层次遍历 | 101. 对称二叉树 | 226.翻转二叉树
    226.翻转二叉树 已解答简单 相关标签相关企业 给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。 示例1:输入:root=[4,2,7,1,3,6,9]输出:[4,7,2,9,6,3,1]示例2:输入:root=[2,1,3]输出:[2,3,1]示例3:输入:root=[]输出:[......
  • 力扣递归 广度优先搜索之102. 二叉树的层序遍历
    classSolution{   List<List<Integer>>result=newArrayList<>();   publicList<List<Integer>>levelOrder(TreeNoderoot){       if(root==null){           returnresult;       }       traverse(root,0);    ......
  • 力扣递归之 543. 二叉树的直径
    classSolution{//二叉树直径其实就是根到左子树最深+根到右子树最深  intdiameter;    publicintdiameterOfBinaryTree(TreeNoderoot){    calculateDepth(root);    returndiameter;  }    privateintcalculateDe......