94 二叉树的中序遍历-简单

题目:

给定一个二叉树的根节点 root ,返回 它的 中序 遍历

分析:

算法1:递归版

func inorderTraversal(root *TreeNode) []int {
  res := make([]int, 0)
  if root == nil { return res }
  // 先访问左子树
  if root.Left != nil {
    res = append(res, inorderTraversal(root.Left)...)
  }
  // 后访问根结点
  res = append(res, root.Val)
  // 最后访问右子树
  if root.Right != nil {
    res = append(res, inorderTraversal(root.Right)...)
  }
  return res
}

算法2:迭代

这里跟前序遍历类似,只是取根节点值加入结果集的时机略有区别。

其主要思路为:

  1. 持续检查其左子树,重复1,直到左子树为空【此时栈中保留的是一系列的左子树节点】

  2. 出栈一次,并取根节点值加入结果集,然后检查最后一个左子树的右子树,重复1,2

// date 2023/10/18
// 迭代版
// 需要stack结构
// left->root->right
func inorderTraversal(root *TreeNode) []int {
    if root == nil {
        return []int{}
    }
    stack := make([]*TreeNode, 0, 16)
    res := make([]int, 0, 16)
    for root != nil || len(stack) != 0 {
        for root != nil {
            stack = append(stack, root)
            root = root.Left
        }
        if len(stack) != 0 {
            root = stack[len(stack)-1]
            stack = stack[:len(stack)-1]
            res = append(res, root.Val)
            root = root.Right
        }
    }
    return res
}

最后更新于