您的位置:首页 > 职场人生

剑指Offer--面试题18:数的子结构--Java实现

2015-06-16 20:26 741 查看
题目描述:

输入两颗二叉树A和B,判断B是不是A的子结构。

解题思路:

要查找树A中是否存在和树B结构一样的子树,我们可以分为两步:第一步在树A中找到和树B的根结点的值一样的结点R,第二步再判断树A中以R为根结点的子树是不是包含和B一样的结构。

通常我们都会采用递归的方式,但是这里需要注意的检查边界条件,即空指针。

代码如下:

public class HasSubTreeTest {

static class Node{
int key;
Node left;
Node right;

Node(int key){
this.key = key;
}
}
public static boolean hasSubTree(Node root1, Node root2){

boolean result = false;

if(root1 != null && root2 != null){
result = doesTreeHaveTree2(root1, root2);

if(!result){
result = hasSubTree(root1.left, root2);
}
if(!result){
result = hasSubTree(root1.right, root2);
}
}

return result;
}
private static boolean doesTreeHaveTree2(Node root1, Node root2) {
if(root2 == null){
return true;
}

if(root1 == null){
return false;
}

if(root1.key != root2.key){
return false;
}

return doesTreeHaveTree2(root1.left, root2.left) && doesTreeHaveTree2(root1.right, root2.right);
}
public static void main(String[] args) {

Node root1 = new Node(8);
Node node8 = new Node(8);
Node node7 = new Node(7);

root1.left = node8;
root1.right = node7;

Node node9 = new Node(9);
node8.left = node9;

Node node2 = new Node(2);
node8.right = node2;

Node node4 = new Node(4);
Node node72 = new Node(7);
node2.left = node4;
node2.right = node72;

Node root2 = new Node(8);
Node node92 = new Node(9);
Node node22 = new Node(2);

root2.left = node92;
root2.right = node22;

System.out.println(hasSubTree(root1, root2));

}

}


代码中的测试案列:

A:



B:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: