难度系数 ⭐⭐⭐难在思路
时间限制 C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
题目内容 输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
思路 递归实现。首先判断A树当前根节点是否与B树根节点值相同,若相同则判断B树是否含于以这个节点为根节点的A树,若含于则返回true,否则递归判断A树根节点的左子树与右子树。
其中,判断B树是否含于以某节点为根节点的A树时,遍历时,如果此时B树为空,则返回true,说明B树已经遍历完了。如果此时B没空而A空了,则说明B不含于A,返回false。若当前节点的值互不相同,则说明两子树不同。递归遍历判断左子树以及右子树是否相同。
package nowcoder;
public class No20 {
public static class Node{
public int value;
public Node left;
public Node right;
public Node(int value){
this.value = value;
}
}
public static boolean HasSubtree(Node head1, Node head2){
if (head1 == null || head2 == null) return false;
if (head2.value == head1.value) {
if (trueStructure(head1, head2)) {
return true;
}
if (HasSubtree(head1.left, head2)){
return true;
}
return HasSubtree(head1.right, head2);
}
return HasSubtree(head1.left, head2) || HasSubtree(head1.right, head2);
}
public static boolean trueStructure(Node head1, Node head2){
if (head2 == null) return true;
if (head1 == null && head2 != null) return false;
if (head1.value != head2.value) return false;
return trueStructure(head1.left, head2.left) && trueStructure(head1.right, head2.right);
}
public static void main(String[] args){
Node head1 = new Node(1);
head1.left = new Node(2);
head1.right = new Node(3);
head1.left.left = new Node(4);
head1.left.right = new Node(5);
head1.right.left = new Node(6);
head1.right.right = new Node(7);
head1.left.left.left = new Node(8);
head1.left.right.right = new Node(9);
head1.right.left.left = new Node(10);
head1.right.left.right = new Node(11);
head1.right.left.left.left = new Node(12);
head1.right.left.left.right = new Node(13);
Node head2 = new Node(6);
head2.left = new Node(10);
head2.right = new Node(11);
head2.left.left = new Node(12);
head2.left.right = new Node(13);
head2.right.right = new Node(14);
Node head3 = null;
System.out.println(HasSubtree(head1, head2));
}
}