本文共 1588 字,大约阅读时间需要 5 分钟。
输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
首先要明白在java中用TreeNode来表示数结构
//树的结构:public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; }}
//解决方法如下:public class Solution { public boolean HasSubtree(TreeNode root1,TreeNode root2) { //首先判断当前节点是否为空:如果root1本身或者root2为空,那么就不存在子结构这样的说法了 if(root1==null||root2==null){ return false; } //首先对根节点进行判断,如果从根节点就匹配到了,那么就可以不进行下面的代码了, //因此可以使用短路的结构,如果第一个条件满足,那么就直接退出,如果第一个条件不满足,接着进行 //第二个条件,如果第二个条件满足,就不用进行第三个条件的判断,如果第二个条件不满足才进行第三个 //条件的判断。 return judge(root1,root2)||judge(root1.left,root2)||judge(root1.right,root2); //再解释一下首先拿两个根节点进行比较,如果匹配到了,返回了true,就直接退出了。如果返回了false,就拿root1节点的左节点跟root2比较,如果发现root1 //的左孩子节点的跟root2匹配上了,返回true,就不用再进行下一个判断了。否则,还有看看root1的右孩子节点跟root2的匹配情况。 } public boolean judge(TreeNode t1,TreeNode t2){ //前面的两个if也可以理解为递归的结束条件。 if(t2==null){ //这句话的意思是如果t2为空,说明遍历完成了,也就是所谓的找到了子树 return true; } if(t1==null){ //这句话的意思代表,t2还没为空,而主数已经为空了,那么说明主树还没有 //子树长,那么可以直接退出。 return false; } //对t1与t2进行值的判断 if(t1.val==t2.val){ //相等 //判断节点的左节点与子树的左节点是否相同,不相同直接短路退出, //返回false,如果相同再判断该节点的右节点是否跟子树节点的右节点是否相同. return judge(t1.left,t2.left)&&judge(t1.right,t2.right); } else{ //不相等 return false; } }}
转载地址:http://drlen.baihongyu.com/