返回

花式遍历二叉树的美妙艺术

IOS

花式遍历二叉树的美妙艺术

在计算机科学中,二叉树是一种重要的数据结构,它具有广泛的应用,包括搜索、排序、数据库索引等。我们通常使用前序遍历、中序遍历和后序遍历来遍历二叉树。然而,除了这些常规遍历方式之外,还存在着许多花式遍历方式,它们可以帮助我们以全新的视角审视这些基本数据结构。

本文将以一个题目为例,分享三种花式遍历方式:

  • 从上到下打印二叉树
  • 从下到上打印二叉树
  • 从左到右打印二叉树

从上到下打印二叉树

从上到下打印二叉树是一种非常直观的遍历方式,它按照树的层级顺序依次打印每个节点。我们可以使用广度优先搜索(BFS)算法来实现这种遍历方式。

func printBinaryTreeFromTopToBottom(_ root: TreeNode?) {
  guard let root = root else {
    return
  }

  var queue: [TreeNode] = []
  queue.append(root)

  while !queue.isEmpty {
    let node = queue.removeFirst()
    print(node.val)

    if let left = node.left {
      queue.append(left)
    }

    if let right = node.right {
      queue.append(right)
    }
  }
}

从下到上打印二叉树

从下到上打印二叉树与从上到下打印二叉树相反,它按照树的层级顺序依次打印每个节点,但从最底层开始打印。我们可以使用深度优先搜索(DFS)算法来实现这种遍历方式。

func printBinaryTreeFromBottomToTop(_ root: TreeNode?) {
  guard let root = root else {
    return
  }

  var stack: [TreeNode] = []
  var result: [Int] = []

  stack.append(root)

  while !stack.isEmpty {
    let node = stack.removeLast()
    result.append(node.val)

    if let left = node.left {
      stack.append(left)
    }

    if let right = node.right {
      stack.append(right)
    }
  }

  for value in result.reversed() {
    print(value)
  }
}

从左到右打印二叉树

从左到右打印二叉树是一种非常有趣的遍历方式,它按照节点在树中的位置依次打印每个节点。我们可以使用中序遍历算法来实现这种遍历方式。

func printBinaryTreeFromLeftToRight(_ root: TreeNode?) {
  guard let root = root else {
    return
  }

  func inorderTraversal(_ root: TreeNode?) {
    guard let root = root else {
      return
    }

    inorderTraversal(root.left)
    print(root.val)
    inorderTraversal(root.right)
  }

  inorderTraversal(root)
}

这三种花式遍历方式只是二叉树遍历的冰山一角,还有许多其他有趣的花式遍历方式等待我们去探索。希望本文能够激发您的探索兴趣,让您对二叉树有更深入的理解。