树的子结构

来源:牛客网  http://www.nowcoder.com/questionTerminal/6e196c44c7004d15b1610b9afca8bd88

题目描述

输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
 
思路:
(1)在树A中查找等于树B根节点的节点R
(2)判断以R为根节点的子树是否包含了树B
其中(1),可用循环或递归的方式遍历树A。我采用了一个Queue用循环的方式层次遍历。
其中(2),递归的判断R的左右节点是否与B的左右节点相同,终止件是到达了A或B叶子节点。
 
 1 import java.util.*;
 2 /**
 3 public class TreeNode {
 4     int val = 0;
 5     TreeNode left = null;
 6     TreeNode right = null;
 7 
 8     public TreeNode(int val) {
 9         this.val = val;
10 
11     }
12 
13 }
14 */
15 public class Solution {
16     // judging root2 is a subtree of root1 or not
17     public static boolean HasSubtree(TreeNode root1, TreeNode root2) {
18         if(root1==null || root2==null) return false;
19         
20         Queue<TreeNode> queue = new LinkedList<TreeNode>();
21         queue.add(root1);
22         TreeNode node;
23         
24         while (!queue.isEmpty()) {
25             node = queue.poll();
26             if (node.left != null) queue.add(node.left);
27             if (node.right != null) queue.add(node.right);
28 
29             if (node.val==root2.val && isSame(node, root2)) 
30                 return true;
31         }
32         return false;
33     }
34 
35     public static boolean isSame(TreeNode t1, TreeNode t2) {
36         if(t2==null) return true;
37         if(t1==null) return false;
38         if(t1.val!=t2.val) return false;
39         return isSame(t1.left,t2.left) && isSame(t1.right,t2.right);
40     }
41 
42 }

cdcd

原文地址:https://www.cnblogs.com/duanguyuan/p/5683932.html