leetcode105. 从前序与中序遍历序列构造二叉树|刷题打卡

90 阅读2分钟

leetcode105. 从前序与中序遍历序列构造二叉树

题目描述:

根据一棵树的前序遍历与中序遍历构造二叉树。

注意: 你可以假设树中没有重复的元素。

例如,给出

前序遍历 preorder = [3,9,20,15,7]
中序遍历 inorder = [9,3,15,20,7]

返回如下的二叉树:

    3
   / \
  9  20
    /  \
   15   7

代码模版(swift)

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     public var val: Int
 *     public var left: TreeNode?
 *     public var right: TreeNode?
 *     public init() { self.val = 0; self.left = nil; self.right = nil; }
 *     public init(_ val: Int) { self.val = val; self.left = nil; self.right = nil; }
 *     public init(_ val: Int, _ left: TreeNode?, _ right: TreeNode?) {
 *         self.val = val
 *         self.left = left
 *         self.right = right
 *     }
 * }
 */
class Solution {
    func buildTree(_ preorder: [Int], _ inorder: [Int]) -> TreeNode? {

    }
}

思路(递归)

中序遍历首先遍历左子树,然后访问根结点,最后遍历右子树。 先序遍历首先访问根节点,然后遍历左子树,最后遍历右子树。

中序遍历是分析树构成的关键,因为先序遍历可以得到根节点,然后中序遍历中根节点可以把树分为左子树和右子树,分开的左右子树重复操作,得到目标树。

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     public var val: Int
 *     public var left: TreeNode?
 *     public var right: TreeNode?
 *     public init(_ val: Int) {
 *         self.val = val
 *         self.left = nil
 *         self.right = nil
 *     }
 * }
 */
class Solution {
    func buildTree(_ preorder: [Int], _ inorder: [Int]) -> TreeNode? {
        if preorder.count == 0 {
            return nil
        }
        let node = TreeNode.init(preorder[0]) // 得到根节点
        for i in 0..<inorder.count {
            if inorder[i] == preorder[0] { // 得到分割点,分开左右子树
                node.left = buildTree(i>0 ? Array(preorder[1...i]) : [], i>0 ? Array(inorder[0..<i]) : [])  // 下标1到i范围内递归分割,直到分割数组不存在元素,生成树成为左子树
                node.right = buildTree(i+1<preorder.count ? Array(preorder[i+1..<preorder.count]) : Array(preorder[i+1..<preorder.count]), i+1<inorder.count ? Array(inorder[i+1..<inorder.count]) : []) // 下标i+1到preoder.count-1范围内递归分割,直到分割数组不存在元素,生成树成为右子树
                break
            }
        }
        return node
    }
}

本文正在参与「掘金 2021 春招闯关活动」, 点击查看活动详情