劍指Offer 17 樹的子結構

2021-10-04 00:19:48 字數 1613 閱讀 2600

題目描述

輸入兩棵二叉樹a,b,判斷b是不是a的子結構。(ps:我們約定空樹不是任意乙個樹的子結構)

題解:遞迴

1

public

static

boolean

hassubtree(treenode root1,treenode root2)

5return tree1hastree2(root1,root2)||hassubtree(root1.left,root2)||hassubtree(root1.right,root2);6}

7public

static

boolean

tree1hastree2(treenode root1,treenode root2)

11if(root2==null)14

return root1.val==root2.val&&tree1hastree2(root1.left,root2.left)

15 &&tree1hastree2(root1.right,root2.right);

16 }

初始化樹:

1

public

static

class

treenode 8}

9private

static listnodelist = null;10

public

static treenode createbintree(int

array)

16//

對前lastparentindex-1個父節點按照父節點與孩子節點的數字關係建立二叉樹

17for (int parentindex = 0; parentindex < array.length / 2 - 1; parentindex++)

23//

最後乙個父節點:因為最後乙個父節點可能沒有右孩子,所以單獨拿出來處理

24int lastparentindex = array.length / 2 - 1;

25//

左孩子26 nodelist.get(lastparentindex).left = nodelist.get(lastparentindex * 2 + 1);

27//

右孩子,如果陣列的長度為奇數才建立右孩子

28if (array.length % 2 == 1)

31return nodelist.get(0);

32 }

測試:

1

public

static

void

main(string args) ;

3int tree2=;

4 treenode root1 =createbintree(tree1);

5 treenode root2 =createbintree(tree2);

6boolean hassubtree =hassubtree(root1, root2);

7system.out.println(hassubtree);8}

9 輸出:true

劍指offer 17 樹的子結構

輸入兩棵二叉樹a,b,判斷b是不是a的子結構。ps 我們約定空樹不是任意乙個樹的子結構 這是典型二叉樹遞迴問題。倆顆樹都不為空時,如果根節點相同,那麼判斷root2是不是root1的子樹,如果不是,那麼判斷root2是不是root1左子樹的子樹,如果還不是,那麼判斷root2是不是root1右子樹的...

劍指Offer (17)樹的子結構

題目描述 輸入兩棵二叉樹a,b,判斷b是不是a的子結構。ps 我們約定空樹不是任意乙個樹的子結構 實現如下 分兩步 第一步 尋找與b樹根節點val相等的a樹節點。如果找到進入第二步,否則繼續尋找,直到找完a樹 第二步 以找的節點作為a樹子樹的根節點,同時遍歷兩棵樹,判斷是否所有節點都相同 特殊情況 ...

劍指offer(17)樹的子結構

19.1.11 題目描述 輸入兩棵二叉樹a,b,判斷b是不是a的子結構。ps 我們約定空樹不是任意乙個樹的子結構 思修很簡單 遍歷a樹,每個a節點與b對比,對比函式為solution。如下 function treenode x function hassubtree proot1,proot2 r...