JavaScript实现重建二叉树

重建二叉树

http://www.nowcoder.com/questionTerminal/8a19cbe657394eeaac2f6ea9b0f6fcf6

重建二叉树的实现思路:根据二叉树中先序遍历和中序遍历特点求解。

  1. 首先确定二叉树根节点的值rootValue,先序序列中的第一个值即为根节点的值,接着在中序序列中找到rootValue的位置,位于rootValue左边的序列为左子树,位于rootValue右边的序列为右子树。这样我们就确定了根节点以及它的两个子树。
  2. 确定根节点的左孩子,先序序列中位于根节点值rootValue后面第一个值就是根节点的左孩子。递归第一步,就可以确定所有节点的左孩子了。
  3. 确定根节点的右孩子,先序序列中位于值rootValue的位置 + 左子树的长度的位置上的值就是根节点的右孩子。递归第一步,就可以确定所有节点的右孩子。
  4. 迭代过程中,要注意书写终止条件,否则就会一直执行导致栈溢出。如何设置终止条件呢?我们注意到二叉树的叶子节点是没有孩子的,所以只要节点的子树长度 < 1时,就返回这个节点,结束迭代。

JavaScript代码实现如下:

function TreeNode(x) {
    this.val = x;
    this.left = null;
    this.right = null;
} 
function reConstructBinaryTree(pre, vin)
{
    if(pre.length !== vin.length) return false;
    return construct(pre, 0, vin, 0, vin.length);
}
function construct(preOrder, preOrderStart, inOrder, inOrderStart, length) {
    // 先序序列中第一个值为根节点的值
    var rootValue = preOrder[preOrderStart],
        root = new TreeNode(rootValue);

    if(length <= 1) {
        return root;
    }

    // 在中序序列中找到根节点的值,确定左子树,右子树
    var rootInorder = inOrder.indexOf(rootValue),
        leftLength =  rootInorder - inOrderStart,
        rightLength = length - 1 - leftLength;

    if(leftLength > 0) {
        root.left = construct(preOrder, preOrderStart + 1, inOrder, inOrderStart, leftLength);
    }
    if( rightLength > 0) {
        root.right = construct(preOrder, preOrderStart + 1 + leftLength, inOrder, rootInorder + 1, rightLength);
    }
    return root;
}
全部评论

相关推荐

11-09 14:54
已编辑
华南农业大学 产品经理
大拿老师:这个简历,连手机号码和照片都没打码,那为什么关键要素求职职位就不写呢? 从上往下看,都没看出自己到底是产品经理的简历,还是电子硬件的简历? 这是一个大问题,当然,更大的问题是实习经历的描述是不对的 不要只是去写实习流程,陈平,怎么去开会?怎么去讨论? 面试问的是你的产品功能点,是怎么设计的?也就是要写项目的亮点,有什么功能?这个功能有什么难处?怎么去解决的? 实习流程大家都一样,没什么优势,也没有提问点,没有提问,你就不得分 另外,你要明确你投的是什么职位,如果投的是产品职位,你的项目经历写的全都是跟产品无关的,那你的简历就没用 你的面试官必然是一个资深的产品经理,他不会去问那些计算机类的编程项目 所以这种四不像的简历,在校招是大忌
点赞 评论 收藏
分享
评论
1
收藏
分享
牛客网
牛客企业服务