题目

给定一个二叉树,返回它的中序 遍历。

示例:

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

方案一(递归)

/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */
func inorderTraversal(root *TreeNode) []int {
    ret := []int{}
    if root != nil {
        ret = append(inorderTraversal(root.Left), root.Val) // 首先遍历左子节点,然后遍历当前节点
        ret = append(ret, inorderTraversal(root.Right)...) // 最后遍历右子节点
    }

    return ret
}

面向对象设计:

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution:
    def __init__(self):
        self.li = []
    def inorderTraversal(self, root: TreeNode) -> List[int]:
        if not root:
            return self.li

        self.inorderTraversal(root.left)
        self.li.append(root.val)
        self.inorderTraversal(root.right)
        return self.li

方案二(迭代)

/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */
func inorderTraversal(root *TreeNode) []int {
    visited := map[*TreeNode]bool{} // 是否已遍历
    stack := []*TreeNode{root}
    ret := []int{}
    for len(stack) > 0 {
        node := stack[len(stack) - 1]
        stack = stack[:len(stack) - 1]
        if _, ok := visited[node]; ok {
            ret = append(ret, node.Val)
            continue
        }
        if node != nil {
            visited[node] = true
            stack = append(stack, node.Right)
            stack = append(stack, node)
            stack = append(stack, node.Left)
        }
    }

    return ret
}

不需要 **visited** 的迭代:

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution:
    def inorderTraversal(self, root: TreeNode) -> List[int]:
        res = []
        stack = []
        # 用p当作指针
        p = root
        while p or stack:
            # 把左子树压入栈中
            while p:
                stack.append(p)
                p = p.left
            p = stack.pop()
            res.append(p.val)
            p = p.right
        return res

原文

https://leetcode-cn.com/explore/learn/card/data-structure-binary-tree/2/traverse-a-tree/2/