问题描述:
给定两个整数数组 preorder 和 inorder ,其中 preorder 是二叉树的先序遍历, inorder 是同一棵树的中序遍历,请构造二叉树并返回其根节点。
输入: preorder = [3,9,20,15,7], inorder = [9,3,15,20,7]
输出: [3,9,20,null,null,15,7]
解题思路:递归
前序遍历的第一个元素就是根节点,然后在中序遍历中找根节点的位置,假设是index, 那么在中序遍历中从0 - index-1的所有元素就是左子树,从index + 1 --- inorder.length - 1的元素就是右子树。随后到左右子树中去递归调用下面的build函数去创建二叉树。代码实现(js)
/**
* 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[]} preorder
* @param {number[]} inorder
* @return {TreeNode}
*/
var buildTree = function(preorder, inorder) {
// 1.定义递归函数
const build = (preStart, preEnd, inStart, inEnd) => {
if(preStart > preEnd) return null
// 1.1 找root,对应前序遍历的第一个节点
let rootVal = preorder[preStart]
// 1.2 找root在中序遍历中的位置
let index = inorder.indexOf(rootVal)
// 1.3 计算root左子树的节点数量
let leftNum = index - inStart
// 1.4 创建根节点
const root = new TreeNode(rootVal)
root.left = build(preStart + 1, preStart + leftNum, inStart, index - 1);
root.right = build(preStart + leftNum + 1, preEnd, index + 1, inEnd);
return root
}
// 2.调用
return build(0, preorder.length - 1, 0, inorder.length - 1)
};
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)