剑指Offer(Java版):树的子结构

二叉树的结构定义为:java

 

[java] view plain copynode

 

  1. package utils;  
  2.   
  3. public class BinaryTreeNode {  
  4.     public int value;  
  5.     public BinaryTreeNode leftNode;  
  6.     public BinaryTreeNode rightNode;  
  7.       
  8.     public BinaryTreeNode(){  
  9.           
  10.     }  
  11.     public BinaryTreeNode(int value){  
  12.         this.value = value ;  
  13.         this.leftNode = null;  
  14.         this.rightNode = null;  
  15.     }  
  16.       
  17. }  

 

或者面试

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);//头结点相等,继续看左右两结点是否是相等         } }

相关文章
相关标签/搜索