Nil's Blog +

LeetCode 94 二叉树的中序遍历 [Swift]

题目

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

示例:

输入: [1,null,2,3]

   1
    \
     2
    /
   3

输出: [1,3,2]

进阶: 递归算法很简单,你可以通过迭代算法完成吗?

思路

采用递归的方法比较直接,对二叉树进行递归遍历,代码实现如下:

class Solution {
    func inorderTraversal(_ root: TreeNode?) -> [Int] {
        var ret = [Int]()
        if root == nil {
            return ret
        }

        traversal(root, valArray: &ret)
        return ret
    }

    func traversal(_ root: TreeNode?, valArray : inout [Int]) {
        if root == nil {
            return
        }

        let right = root!.right
        let left = root!.left
        if left != nil {
            traversal(left, valArray: &valArray)
        }

        valArray.append(root!.val)

        if right != nil {
            traversal(right, valArray: &valArray)
        }
    }
}

另外题目还提出了是否可以采用迭代算法解题。

为了求解,我们需要利用到 “栈” 的数据结构,首先对根节点的所有的左子节点进入入栈,然后出栈,对出栈的节点内容进行记录,记录完毕后,视出栈节点的右子树为根节点,进行之前同样的操作。代码实现如下:

class Solution {
    func inorderTraversal(_ root: TreeNode?) -> [Int] {
        var ret = [Int]()
        if root == nil {
            return ret
        }
        
        var stack = [TreeNode]()
        var curNode = root
        while curNode != nil || stack.count != 0 {
            while curNode != nil {
                stack.append(curNode!)
                curNode = curNode!.left
            }
            curNode = stack.popLast()
            ret.append(curNode!.val)
            curNode = curNode!.right
        }
        return ret
    }
}

技术

算法

项目