Swift二叉树的遍历递归和非递归

370 阅读1分钟

         3

    4          5

6     7      8      9

   10    11

二叉树的定义和初始化

二叉树的前序遍历:

func preorder(root:TreeNode?) -> [Int] {
    guard let root = root else {
        return []
    }
    var res = [Int]()
    res.append(root.val)
    res += preorder(root: root.left)
    res += preorder(root: root.right)
    return res
}

func preorderTraversal(root:TreeNode?) ->[Int] {
    guard let root = root else {
        return []
    }
    var res = [Int]()
    var roots = [TreeNode]()
    var current:TreeNode? = root
    
    while !roots.isEmpty || current != nil {
        while current != nil {
            res.append(current!.val)
            roots.append(current!)
            current = current!.left
        }
        if current == nil {
            current = roots.removeLast()
            current = current?.right
        }
    }
    return res
}

let resVal = preorder(root: root)//[3, 4, 6, 7, 10, 11, 5, 8, 9]
let resVal1 = preorderTraversal(root: root)//[3, 4, 6, 7, 10, 11, 5, 8, 9]

二叉树的中序遍历:

func inOrder(root:TreeNode?) -> [Int] {
    guard let root = root else {
        return []
    }
    var res = [Int]()
    res += inOrder(root: root.left)
    res.append(root.val)
    res += inOrder(root: root.right)
    return res
}

func inorderTraversal(root: TreeNode?) ->[Int] {
    guard let root = root else {
        return []
    }
    var res = [Int]()
    var roots = [TreeNode]()
    var current:TreeNode? = root
    while !roots.isEmpty || current != nil {
        while current != nil {
            roots.append(current!)
            current = current!.left
        }
        if current == nil {
            current = roots.removeLast()
            res.append(current!.val)
            current = current!.right
        }
    }
    return res
}

var resVal2 = inOrder(root: root)//[6, 4, 10, 7, 11, 3, 8, 5, 9]
var resVal3 = inorderTraversal(root: root)//[6, 4, 10, 7, 11, 3, 8, 5, 9]

二叉树的后续遍历:

func postOrder(root:TreeNode?) -> [Int] {
    guard let root = root else { return [] }
    
    var res = [Int]()
    res += postOrder(root: root.left)
    res += postOrder(root: root.right)
    res.append(root.val)
    return res
}

func postorderTraversal(root:TreeNode?) -> [Int] {
    guard let root = root else { return [] }
    var res = [Int]()
    var roots = [TreeNode]()
    roots.append(root)
    while !roots.isEmpty {
        let current:TreeNode? = roots.removeLast()
        res.append(current!.val)
        if current!.left != nil {
            roots.append(current!.left!)
        }
        if current!.right != nil {
            roots.append(current!.right!)
        }
    }
    return res.reversed()
}

let resVal4 = postOrder(root: root)//[6, 10, 11, 7, 4, 8, 9, 5, 3]
let resVal5 = postorderTraversal(root: root)//[6, 10, 11, 7, 4, 8, 9, 5, 3]