Leetcode刷题(第105题)——从前序与中序遍历序列构造二叉树

x33g5p2x  于2022-03-10 转载在 其他  
字(1.2k)|赞(0)|评价(0)|浏览(333)

一、题目

  1. 给定两个整数数组 preorder inorder ,其中 preorder 是二叉树的先序遍历, inorder 是同一棵树的中序遍历,请构造二叉树并返回其根节点。

二、示例

  1. 输入: preorder = [3,9,20,15,7], inorder = [9,3,15,20,7]
  2. 输出: [3,9,20,null,null,15,7]
  1. 输入: preorder = [-1], inorder = [-1]
  2. 输出: [-1]

三、解题思路
本题给我们前序遍历和中序遍历,这样我们就可以确定一个树。本题中我们使用的是递归算法。本题以preorder = [3,9,20,15,7]inorder = [9,3,15,20,7]为例。从先序遍历中我们可以知道根节点是3,然后我们在进行查找在中序遍历中3的左边为根节点的左子树的中序遍历,3的右边为根节点的右子树的中序遍历,然后再从preorder中查找左子树的先序遍历和右子树的先序遍历。最终再次使用递归算法即可。
四、代码

  1. /**
  2. * Definition for a binary tree node.
  3. * function TreeNode(val, left, right) {
  4. * this.val = (val===undefined ? 0 : val)
  5. * this.left = (left===undefined ? null : left)
  6. * this.right = (right===undefined ? null : right)
  7. * }
  8. */
  9. /**
  10. * @param {number[]} preorder
  11. * @param {number[]} inorder
  12. * @return {TreeNode}
  13. */
  14. var buildTree = function(preorder, inorder) {
  15. let firstOne = preorder[0]
  16. let node = new TreeNode(firstOne)
  17. let index = inorder.findIndex(value => value === firstOne)
  18. let leftPreOrder = preorder.slice(1, index + 1)
  19. let rightPreOrder = preorder.slice(index + 1)
  20. let leftInOrder = inorder.slice(0, index)
  21. let rightInOrder = inorder.slice(index + 1)
  22. if(leftInOrder.length && leftPreOrder) {
  23. node.left = buildTree(leftPreOrder, leftInOrder)
  24. }
  25. if(rightInOrder.length && rightPreOrder.length) {
  26. node.right = buildTree(rightPreOrder, rightInOrder)
  27. }
  28. return node
  29. };

五、总结

相关文章