《剑指offer》JavaScript版16-18题
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); }