思路

1 了解先根和中根的特点
2 从先根中可以得到根节点
3 中根中可以得到两边的节点
4 利用函数递归

根据前序遍历的性质,第一个元素必然就是root,那么下面的工作就是如何确定root的左右子树的范围。 根据中序遍历的性质,root元素前面都是root的左子树,后面都是root的右子树。那么我们只要找到中序遍历中root的位置,就可以确定好左右子树的范围。

代码

  1. function reConstructBinaryTree(pre, vin)
  2. {
  3. // write code here
  4. if(pre.length == 0 || vin.length == 0 ) {
  5. return null;
  6. }
  7. var binaryTree = new TreeNode(pre[0]);
  8. var pre_left = [], pre_right = [], vin_left = [], vin_right = [];
  9. var index = vin.indexOf(pre[0]);
  10. pre_left = pre.slice(1, index+1);
  11. pre_right = pre.slice(index+1);
  12. vin_left = vin.slice(0, index);
  13. vin_right = vin.slice(index+1);
  14. binaryTree.left = reConstructBinaryTree(pre_left, vin_left);
  15. binaryTree.right = reConstructBinaryTree(pre_right, vin_right);
  16. return binaryTree;
  17. }

小结

无论怎样遍历,左子节点的内容都永远不保持在左节点上,所以其阅读顺序肯定是优先于右边节点的。因此按照节点数分割就可以拿到左边和右边子节点的内容。