树的子结构判断

题目描述:输入两棵二叉树A,B,判断B是不是A的子结构(约定空树不是任意一棵树的子结构)

思路:

1.首先设置标志位result=false,因为一旦匹配成功,则将标志位置为真,如果匹配不成功,则默认返回false

2.递归思想,若根节点相同,则递归调用DoseTree1hasTree2(),若根节点不同,则判断tree1的左子树和tree2是否相同,再判断tree1的右子树和tree2是否相同

3.判断null的条件,当两棵树都不为空的时候才开始判断是否是子树。

在DoseTree1hasTree2()中,当tree2遍历结束,则匹配成功,tree1为空有两种情况,1)仅1为空,则不匹配;2)两棵树都为空,则遍历成功。

求解结果:

 1 /**
 2 public class TreeNode {
 3     int val = 0;
 4     TreeNode left = null;
 5     TreeNode right = null;
 6 
 7     public TreeNode(int val) {
 8         this.val = val;
 9 
10     }
11 
12 }
13 */
14 public class Solution {
15     public static boolean HasSubtree(TreeNode root1,TreeNode root2) {
16         boolean result = false;
17         //当两棵树都不为空的时候,才进行比较。否则直接返回false
18         if(root1!=null&&root2!=null){
19             //如果找到了对应Tree2的根节点的点
20             if(root1.val == root2.val){
21                 //以该跟节点为起点判断是否包含Tree2
22                 result = doseTree1hasTree2(root1,root2);
23             }
24             //若没找到,则以Tree1的左子树和右子树来判断Tree2是否是其子树
25             if(!result){
26                 result = HasSubtree(root1.left,root2) || HasSubtree(root1.right,root2);
27             }
28         }
29         //返回结果
30         return result;
31     }
32     public static boolean doseTree1hasTree2(TreeNode node1,TreeNode node2){
33         //若Tree2已经遍历完了,都能对应上,则返回True 
34         if(node2==null)
35             return true;
36         //若Tree1已经遍历完了,而Tree2却没遍历完,则返回false
37         if(node1==null)
38             return false;
39         //如果其中一个点没有对应上,则返回false
40         if(node1.val!=node2.val)
41             return false;
42         //若根节点对应得上,则去其子节点中匹配
43         return doseTree1hasTree2(node1.left,node2.left) && doseTree1hasTree2(node1.right,node2.right);
44     }
45 }
原文地址:https://www.cnblogs.com/10081-AA/p/10664570.html