首页 > 编程语言 >代码随想录算法训练营第12天 | 树的遍历

代码随想录算法训练营第12天 | 树的遍历

时间:2023-12-31 16:23:12浏览次数:45  
标签:遍历 TreeNode res 随想录 curNode 12 return root stack

(本合集全部为Go语言实现)

相关文章链接:递归遍历 迭代遍历 统一迭代法
相关视频链接:

Leetcode94

状态:
实现过程中的难点:迭代法的模拟过程比较难想

个人写法

递归方式

func inorderTraversal(root *TreeNode) []int {
  var res []int
  inorderTraversal0(root, &res)
  return res
}

func inorderTraversal0(root *TreeNode, res *[]int) {
  if (root == nil) {
    return
  }

  inorderTraversal0(root.Left, res)
  *res = append(*res, root.Val)
  inorderTraversal0(root.Right, res)
}

迭代写法

通过模拟遍历过程,整体可以分成两种情况:

  • 指针指向的节点不为空,此时需要先将节点入栈,而不是先进行处理,因为中序遍历顺序为左中右

  • 指针指向的节点为空,此时又有两种情况:

    • 指针节点为左孩子时,指针指向栈顶元素,为父节点,表示父节点的左子树遍历完成
    • 指针节点为右孩子时,指针指向栈顶元素,为父节点的某个父节点(因为父节点可能是右子树),表示这个父节点的左子树遍历完成
func inorderTraversal(root *TreeNode) []int {
  var res []int
  if root == nil {
    return res
  }

  var stack []*TreeNode
  push := func(node *TreeNode) {
    stack = append(stack, node)
  }
  pop := func() *TreeNode {
    tmp := stack[len(stack) - 1]
    stack = stack[:len(stack) - 1]
    return tmp
  }

  curNode := root
  for curNode != nil || len(stack) != 0 {
    if curNode != nil {
      push(curNode)
      curNode = curNode.Left
    } else {
      curNode = pop()
      res = append(res, curNode.Val)
      curNode = curNode.Right
    }
  }
  return res
}

Leetcode145

状态:
实现过程中的难点:

个人写法

递归写法

func postorderTraversal(root *TreeNode) []int {
  var res []int
  postorderTraversal0(root, &res)
  return res
}

func postorderTraversal0(root *TreeNode, res *[]int) {
  if (root == nil) {
    return
  }

  postorderTraversal0(root.Left, res)
  postorderTraversal0(root.Right, res)
  *res = append(*res, root.Val)
}

迭代写法

func postorderTraversal(root *TreeNode) []int {
  var res []int
  
  if root == nil {
    return res
  }

  var stack []*TreeNode
  push := func(node *TreeNode) {
    stack = append(stack, node)
  }
  pop := func() *TreeNode {
    tmp := stack[len(stack) - 1]
    stack = stack[:len(stack) - 1]
    return tmp
  }

  push(root)
  for len(stack) > 0 {
    curNode := pop()

    res = append(res, curNode.Val)
    if curNode.Left != nil {
      push(curNode.Left)
    }
    if curNode.Right != nil {
      push(curNode.Right)
    }
  }
  for i, j := 0, len(res) - 1; i < j; i, j = i + 1, j - 1 {
    res[i], res[j] = res[j], res[i]
  }
  return res
}

Leetcode144

状态:
实现过程中的难点:

个人写法

递归写法

func preorderTraversal(root *TreeNode) []int {
  var res []int
  preorderTraversal0(root, &res)
  return res
}

func preorderTraversal0(root *TreeNode, res *[]int) {
  if (root == nil) {
    return
  }

  *res = append(*res, root.Val)
  preorderTraversal0(root.Left, res)
  preorderTraversal0(root.Right, res)
}

迭代写法

func preorderTraversal(root *TreeNode) []int {
  var res []int

  if root == nil {
    return res
  }

  var stack []*TreeNode
  push := func(node *TreeNode) {
    stack = append(stack, node)
  }
  pop := func() *TreeNode {
    tmp := stack[len(stack) - 1]
    stack = stack[:len(stack) - 1]
    return tmp
  }

  push(root)
  for len(stack) > 0 {
    curNode := pop()

    res = append(res, curNode.Val)
    if curNode.Right != nil {
      push(curNode.Right)
    }
    if curNode.Left != nil {
      push(curNode.Left)
    }
  }
  
  return res
}

今日收获

  • 主要是又复习了一下迭代法,尤其是的中序遍历的迭代法

学习时长:2小时左右

标签:遍历,TreeNode,res,随想录,curNode,12,return,root,stack
From: https://www.cnblogs.com/geJoyo/p/17937612

相关文章

  • 2023.12.31模拟赛总结
    前言:这次还行,今年的最后一场比赛,300pts,rank4T1赛时摆烂了,没有牢记“正难则反”,打了暴力,还挂了正解从后往前考虑,考虑在这个点对后面的点的影响,发现就是p乘上了一个系数,直接从后往前算的时候乘上即可,最后再考虑初始的wT2发现取权值连续的一段数一定是最优的,随便维护一下即可T3......
  • 2023-12-31 训练总结
    这次状态比较好,该打的部分分都打了,该打的对拍也都打了。T1最小最大和ProblemDescriptionAlice和Bob在玩一个游戏,每一轮Bob都会给Alice两个整数A和B(1<=A,B<=100),Alice每一轮必须把目前所有的A序列和B序列中的数一一配对,每个数必须用且只使用一次,要求最大和最小。Input......
  • OI练习记录 - 30/12/2023
    连续打了7小时[1]午餐忘了吃......
  • day03 代码随想录算法训练营 203. 移除链表元素
    题目:203.移除链表元素我的感悟:题目里的节点是已经给好的,创建虚拟节点,是为了方便处理头节点。加油,我可以的!!!!!理解难点:节点已经给好的创建虚拟节点代码难点:p是临时变量,类似于foriinrange(10)这里的i,本身是用完就扔的。返回值为什么不能是p.next?因为p是一个指针,......
  • CF121E Lucky Array
    题意给定一个序列,维护下列操作。区间加区间查询数中只包含\(4,7\)数的个数。所有数前后不超过\(1e4\)。Sol块块版。\(1e4\),发现满足条件的数的个数只有\(30\)个。对于每个块开一个桶,记录每种数有多少个。查询时暴力枚举\(30\)个数,暴力判断即可。修改是平凡的......
  • Python趣味入门12:初遇类与实例
    小牛叔用轻松有趣的故事,带你进入Python的编程世界。1、类一提到类大神们就经常说封装。说白了,封装即把围绕同一个对象相同的代码、数据整合在一起。比如在某段游戏代码中(比如熊猫厨房),有一个“面包”:1、游戏提供“烘烤”的操作。->很明显这是动作->类的方法2、面包有硬度指......
  • 2023.12.31做题纪要
    TJOI2015弦论身为彩笔的我觉得这道题还不错???对于新学的我来说挺考验对\(SAM\)的理解??要用一个类似洛谷\(SAM\)板子题的数组来记录每个节点的\(right(endpos)\)集合的大小。最后维护一下就行了。主要难在证明。晴天#include<bits/stdc++.h>constintMAXN=3*(5......
  • 2023-2024-1 20231412 《计算机基础与程序设计》第14周学习总结
    2023-2024-120231412《计算机基础与程序设计》第14周学习总结作业信息这个作业属于哪个课程https://edu.cnblogs.com/campus/besti/2022-2023-1-CFAP这个作业要求在哪里https://edu.cnblogs.com/campus/besti/2023-2024-1-CFAP/homework/13011这个作业的目标《C......
  • 2023-12-30-aliyun-dev-env
    阿里云开发环境搭建开发的烦恼依赖很多的中间件,每天的本地开发都要启动很多的中间件服务。不但启动反锁,还严重占用电脑硬件资源。于是,想起了不久前购买的云服务器。服务器配置只是一台配置简陋的云服务器,勉强可以分摊一部分的中间件服务。如何快速访问通过创建密钥对来实......
  • 2023-12-30:用go语言,给你一个下标从 0 开始的整数数组 nums ,它包含 n 个 互不相同 的正
    2023-12-30:用go语言,给你一个下标从0开始的整数数组nums,它包含n个互不相同的正整数,如果nums的一个排列满足以下条件,我们称它是一个特别的排列。对于0<=i<n-1的下标i:要么nums[i]%nums[i+1]==0,要么nums[i+1]%nums[i]==0。请你返回特别排列的总数目,由于答......