leetcode 106 题 [medium]
中:从中序与后序遍历序列构造二叉树
英:Construct Binary Tree from Inorder and Postorder Traversal
-
切题口
(1)postorder: 从右到左递归存放着,当前root, 右子树的root,左子树的root
(2)inorder: 当前的root能对数组左右区域进行划分,左侧为左子树结点,右侧为右子树结点
(3)从右到左搜索postorder,依次获得当前root、右子树root、右子树的右子树的root…左子树的root…。然后借用这些root便能在inorder中递归地按序划分当前结点、右子树、左子树 -
题解
/** * 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); };
-
相似题目:从前序与中序遍历序列构造二叉树