题目
题目:输入两个二叉树A和B,判断B是不是A的子结构。
思路
判断B是不是A的子结构可以分两步:
- 在A中是否存在与B根节点值相同的节点
该步就是在二叉树A中按照前序遍历的方式查找是否有与B根节点相同的节点 - 在A中找到与B根节点值相同的节点之后,判断该节点的子树是否跟B的结构相同
在该步中,判断A的左子树与B的左子树是否相同,A的右子树是否与B的右子树相同,特别应该注意的是:如果B的节点为null,则表明A中包含B
java代码
package com.cu;
class Node{
int value;
Node leftTree;
Node rightTree;
public Node(){}
public Node(int value){
this.value = value;
this.leftTree = null;
this.rightTree = null;
}
}
public class TreeStructure {
public static void main(String[] args) {
Node nodeA = new Node(8);
nodeA.leftTree = new Node(8);
nodeA.leftTree.leftTree = new Node(9);
nodeA.leftTree.rightTree = new Node(2);
nodeA.rightTree = new Node(7);
Node nodeB = new Node(8);
nodeB.leftTree = new Node(9);
nodeB.leftTree.leftTree = new Node(6);
nodeB.rightTree = new Node(3);
System.out.println(HasSubTree(nodeA,nodeB));
}
//判断二叉树A中是否有与二叉树B根节点相同的节点
public static boolean HasSubTree(Node nodeA,Node nodeB){
boolean result = false;
if(nodeA != null && nodeB != null){
if(nodeA.value == nodeB.value){
result = SubTreeVerify(nodeA,nodeB);
}
if(!result){
result = HasSubTree(nodeA.leftTree,nodeB);
}
if(!result){
result = HasSubTree(nodeA.rightTree,nodeB);
}
}
return result;
}
//在A中找到相同的节点之后,判断其子树是否与二叉树B结构相同
public static boolean SubTreeVerify(Node nodeA,Node nodeB){
if(nodeB == null){
return true;
}
if(nodeA == null){
return false;
}
if(nodeA.value != nodeB.value){
return false;
}
return SubTreeVerify(nodeA.leftTree,nodeB.leftTree) && SubTreeVerify(nodeA.rightTree,nodeB.rightTree);
}
}