劍指Offer--面試題18:數的子結構--Java實現
阿新 • • 發佈:2019-01-28
題目描述:
輸入兩顆二叉樹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: