【二叉树】重建二叉树

这篇博客介绍了如何通过给定的二叉树前序遍历和中序遍历结果来构建二叉树。作者提供了一个Swift实现的解决方案,利用递归的方式,根据中序遍历的中间节点作为分界点,逐级构建左子树和右子树。此外,还推荐了一个名为XCompiler的小型在线编辑器供读者体验。
摘要由CSDN通过智能技术生成

0x00 题目

输入某二叉树的前序遍历和中序遍历的结果
构建该二叉树并返回其节点

假设输入的前序遍历和中序遍历的
结果中都不含重复的数字


0x01 思路

前序遍历的路径是:,左,右
中序遍历的路径是:左,,右
为分界点,可以分割出左右子树
再分别对左右子树进行分割即可


0x02 解法

语言:Swift

树节点:TreeNode

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
    }
}

解法:

func buildTree(_ preorder: [Int], _ inorder: [Int]) -> TreeNode? {
    // 中序遍历中,值 对应的 索引
    var dict: [Int:Int] = [:]
    for i in 0..<inorder.count {
        dict[inorder[i]] = i
    }

    func build(_ preorder: [Int], _ preStart: Int, _ preEnd: Int, _ inorder: [Int], _ inStart: Int, _ inEnd: Int) -> TreeNode? {
        if preStart > preEnd || inStart > inEnd {
            return nil
        }

        let val = preorder[preStart]
        
        // 对应的索引
        let index = dict[val]!
        // 左子树在数组中的长度
        let leftSize = index - inStart
        
        let root = TreeNode(val)
        root.left = build(preorder, preStart+1, preStart+leftSize, inorder, inStart, index-1)
        root.right = build(preorder, preStart+leftSize+1, preEnd, inorder, index+1, inEnd)
        return root
    }

    let node = build(preorder, 0, preorder.count-1, inorder, 0, inorder.count-1)
    return node
}

0x03 我的小作品

欢迎体验我的作品之一:小编辑器-XCompiler
小巧的在线编辑器
App Store 搜索即可~


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

豪冷啊

你的鼓励是对我的认可!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值