算法 从中序与后序遍历序列构造二叉树

本博客主要讲解了如何利用LeetCode 106题来从给定的中序和后序遍历序列构建二叉树。通过理解后序遍历的特点(从右到左,依次存放当前root及其子树root)和中序遍历(将数组划分为左右子树),可以递归地找到并构建每个节点。
摘要由CSDN通过智能技术生成

leetcode 106 题 [medium]
中:从中序与后序遍历序列构造二叉树
英:Construct Binary Tree from Inorder and Postorder Traversal
在这里插入图片描述

  1. 切题口
    (1)postorder: 从右到左递归存放着,当前root, 右子树的root,左子树的root
    (2)inorder: 当前的root能对数组左右区域进行划分,左侧为左子树结点,右侧为右子树结点
    (3)从右到左搜索postorder,依次获得当前root、右子树root、右子树的右子树的root…左子树的root…。然后借用这些root便能在inorder中递归地按序划分当前结点、右子树、左子树

  2. 题解

    /**
     * Definition for a binary tree node.
     * function TreeNode(val, left, right) {
     *     this.val = (val===undefined ? 0 : val)
     *     this.left = (left===undefined ? null : left)
     *     this.right = (right===undefined ? null : right)
     * }
     */
    /**
     * @param {number[]} inorder
     * @param {number[]} postorder
     * @return {TreeNode}
     */
    var buildTree = function(inorder, postorder) {
        // 预处理
        if(!inorder || !postorder) return null;
        // 递归
        let pP = postorder.length-1;    // postorderPointer
        function recurse(_l, _r){
            /*
        	 * @param {number} _l: 当前子树在inorder对应的起始位置
        	 * @param {number} _r: 当前子树在inorder对应的结束位置(闭)
        	 */
            // 预处理
            if(_r < _l) return null;
            // 寻找当前inorder的root所在位置
            let iP = _l;    // inorderPointer
            while(inorder[iP] !== postorder[pP]) iP++;
            // pP左移
            pP--;
            // 使用iP划分左右区域,按序对右、左子树进行递归
            let right = recurse(iP+1, _r);
            let left = recurse(_l, iP-1);
            return new TreeNode(inorder[iP], left, right);
        }
        return recurse(0, inorder.length-1);
    };
    
  3. 相似题目:从前序与中序遍历序列构造二叉树

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值