二叉树的结构定义为:java
[java] view plain copynode
或者面试
class BinaryTreeNode{
int data;
BinaryTreeNode leftNode;
BinaryTreeNode rightNode;
}app
题目:输入两棵二叉树A和B,判断B是否是A的子结构。this
例如图中所示的两棵二叉树,因为A中有一部分子树的结构和B 是同样的,所以B是A的子结构。spa
要查找树A中是否存在和树B结构同样的子树,咱们能够分两步:第一步在树A中找到和B的根节点的值同样的结点R,第二步再判断树A中以R为根结点的子树是否是包含和树B同样的结构。.net
以上面的两棵树为例来详细分析这个过程。首先咱们试着在树A中找到值 为8的结点。从树A的根节点开始遍历,咱们发现它的根节点的值就是8.接着咱们就去判断树A的根节点下面的子树是否是含有和树B同样的结构。在树A中,根 节点的左子结点的值是8,而树B的根节点的左子结点是9,对应的两个结点不一样。指针
所以咱们仍然要遍历A,接着查找值为8的结点。咱们在树的第二层中找 到一个值为8 的结点,而后进行第二步的判断,即判断这个结点下面的子树是否含有和树B同样结构的子树。因而咱们遍历这个结点下面的子树,前后获得两个子节点9和2,这 和树B的结构彻底相同。此时咱们在树A中找到了一个和树B的结构同样的子树,所以树B和树A的子结构。blog
在面试的时候,咱们必定要检查边界条件,即检查空指针。当树A或树B为空的时候,定义相同的输出。若是没有检查并作响应的处理,程序很是容易崩溃,这是面试的时候很是忌讳的事情。ip
下面咱们用Java代码来实现:
package cglib;
class BinaryTreeNode{
int data;
BinaryTreeNode leftNode;
BinaryTreeNode rightNode;
}
public class DeleteNode { public static void main(String args[]) { BinaryTreeNode root1=new BinaryTreeNode(); BinaryTreeNode node1=new BinaryTreeNode(); BinaryTreeNode node2=new BinaryTreeNode(); BinaryTreeNode node3=new BinaryTreeNode(); BinaryTreeNode node4=new BinaryTreeNode(); BinaryTreeNode node5=new BinaryTreeNode(); BinaryTreeNode node6=new BinaryTreeNode(); root1.leftNode=node1; root1.rightNode=node2; node1.leftNode=node3; node1.rightNode=node4; node4.leftNode=node5; node4.rightNode=node6; root1.data=8; node1.data=8; node2.data=7; node3.data=9; node4.data=2; node5.data=4; node6.data=7; BinaryTreeNode root2=new BinaryTreeNode(); BinaryTreeNode a=new BinaryTreeNode(); BinaryTreeNode b=new BinaryTreeNode(); root2.leftNode=a; root2.rightNode=b; root2.data=8; a.data=9; b.data=2; DeleteNode test=new DeleteNode(); System.out.println(test.hasSubTree(root1, root2)); } public boolean hasSubTree(BinaryTreeNode root1,BinaryTreeNode root2){ boolean result=false; if(root1!=null&&root2!=null){ if(root1.data==root2.data){//8,8 result=doesTree1HavaTree2(root1,root2); if(!result) result=hasSubTree(root1.leftNode, root2);//看左结点8是否是等于头结点8 if(!result) result=hasSubTree(root1.rightNode, root2); } } return result;//8,9不等 } private boolean doesTree1HavaTree2(BinaryTreeNode root1, BinaryTreeNode root2) { if(root2==null){ return true; } else if(root1==null) return false; if(root1.data!=root2.data){ return false; } return doesTree1HavaTree2(root1.leftNode, root2.leftNode)&& doesTree1HavaTree2(root1.rightNode, root2.rightNode);//头结点相等,继续看左右两结点是否是相等 } }