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 春招闯关活动」, 点击查看活动详情