题目:输入两棵二叉树A和B,判断B是不是A的子结构。

1)在树A中找到和B的根结点的值一样的结点R。
2)再判断树A中以R为根结点的子树是不是包含和树B一样的结构。
public class BinaryTreeNode{ int value; BinaryTreeNode left; BinaryTreeNode right; public BinaryTreeNode(int val,BinaryTreeNode leftNode,BinaryTreeNode rightNode){ this.value=val; this.left=leftNode; this.right=rightNode; } }
public class Solution{ public static boolean hasSubTree(BinaryTreeNode node1,BinaryTreeNode2 node2){ boolean result=false; if(node1!=null&&node2!=null){ //如果值相等,比较剩余结点的值是否相等 if(node1.value==node2.value){ result=doesTree1HasTree2(node1,node2); } //当前结点的左子结点是否包含目标结点 if(!result){ result=hasSubTree(node1.left,node2); } //当前结点的右子结点是否包含目标结点 if(!result){ result=hasSubTree(node1.right,node2); } } return result; } public static boolean doesTree1HasTree2(BinaryTreeNode node1,BinaryTreeNode node2){ //node2为null,不管node1为何值,结果都为true if(node2==null){ return true; } //node2为非null,node1为null,结果为false if(node1==null){ return false; } //比较当前两个的值是否相等 if(node1.value!=node2.value){ return false; } //进行下一个结点的比较 return doesTree1HasTree2(node1.left,node2.left)&&doesTree1HasTree2(node1.right,node2.right); } public static void main(String[] args){ BinaryTreeNode node7=new BinaryTreeNode (7,null,null); BinaryTreeNode node6=new BinaryTreeNode (4,null,null); BinaryTreeNode node5=new BinaryTreeNode (2,node6,node7); BinaryTreeNode node4=new BinaryTreeNode (9,null,null); BinaryTreeNode node3=new BinaryTreeNode (8,node4,node5); BinaryTreeNode node2=new BinaryTreeNode (7,null,null); BinaryTreeNode node1=new BinaryTreeNode (8,node2,node3); BinaryTreeNode node8=new BinaryTreeNode (9,null,null); BinaryTreeNode node9=new BinaryTreeNode (2,null,null); BinaryTreeNode node10=new BinaryTreeNode (12,node8,node9); System.out.println("node1 has a sub tree node10? "+hasSubTree(node1,node10)); } }
posted on
浙公网安备 33010602011771号