首页 > 技术文章 > 《剑指offer》JavaScript版16-18题

jiaxiaonuo 2017-08-28 22:47 原文

16合并两个排序的链表

题目

  输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。

思路

  使用递归的方法,定义一个新链表head。如果 第一个链表pHead1的第一个值小于第二个链表表pHead2的第一个值,那么将pHead1.val放入head,继续比较后面的。否则将pHead2.val放入head,继续比较。

代码

function Merge(pHead1,pHead2){
    if(pHead1==null||pHead2==null){
        return pHead1||pHead2;
    }
    var head=null;//定义一个新的链表
    if(pHead1.val<pHead2.val){
        head=pHead1;
        head.next=Merge(pHead1.next,pHead2);
    }else{
        head=pHead2;
        head.next=Merge(pHead1,pHead2.next);
    }
    return head;
}

 

17树的子结构

题目

  输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)

思路

1.如果根节点相同则递归调用isSubtree(),如果根节点不相同,则判断root1的左子树和root2是否相同,再判断右子树和tree2是否相同;

2.注意null的条件,HasSubTree中,如果两棵树都不为空才进行判断,isSubtree中,如果root2为空,则说明第二棵树遍历完了,即匹配成功;

3.root1为空有两种情况:(1)如果root1为空&&root2不为空说明不匹配,(2)如果root1为空,root2为空,说明匹配。

代码

function isSubtree(root1,root2){
    if(root2==null)return true;
    if(root2==null)return false;
    if(root1.val==root2.val){
        return isSubtree(root1.left,root2.left)&&isSubtree(root1.right,root2.right);
    }else{
        return false;
    }
}
function hasSubtree(pRoot1,pRoot2){
    if(pRoot1==null||pRoot2==null){
        return false;
    }
    return isSubtree(pRoot1,pRoot2)||hasSubtree(pRoot1.left,pRoot2)||hasSubtree(pRoot1.right,pRoot2);
}

 

18二叉树的镜像

题目

  操作给定的二叉树,将其变换为源二叉树的镜像。

思路

  二叉树用到递归了,如果根节点在,将他的左孩子与右孩子交换,如此递归下去。

代码

function Mirror(root){
    if(root==null){
        return;
    }
    var temp=root.left;
    root.left=root.right;
    root.right=temp;
    if(root.left) Mirror(root.left);
    if(root.right)Mirror(root.right);
}

 

推荐阅读