思路
1 了解先根和中根的特点
2 从先根中可以得到根节点
3 中根中可以得到两边的节点
4 利用函数递归
根据前序遍历的性质,第一个元素必然就是root,那么下面的工作就是如何确定root的左右子树的范围。 根据中序遍历的性质,root元素前面都是root的左子树,后面都是root的右子树。那么我们只要找到中序遍历中root的位置,就可以确定好左右子树的范围。
代码
function reConstructBinaryTree(pre, vin)
{
// write code here
if(pre.length == 0 || vin.length == 0 ) {
return null;
}
var binaryTree = new TreeNode(pre[0]);
var pre_left = [], pre_right = [], vin_left = [], vin_right = [];
var index = vin.indexOf(pre[0]);
pre_left = pre.slice(1, index+1);
pre_right = pre.slice(index+1);
vin_left = vin.slice(0, index);
vin_right = vin.slice(index+1);
binaryTree.left = reConstructBinaryTree(pre_left, vin_left);
binaryTree.right = reConstructBinaryTree(pre_right, vin_right);
return binaryTree;
}
小结
无论怎样遍历,左子节点的内容都永远不保持在左节点上,所以其阅读顺序肯定是优先于右边节点的。因此按照节点数分割就可以拿到左边和右边子节点的内容。