17 樹的子結構

2021-10-23 23:01:40 字數 1837 閱讀 7342

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

採用遞迴的思路,單獨定義乙個函式判斷b是不是從當前a的根節點開始的子樹,這裡判斷是不是子樹也需要乙個遞迴的判斷。如果是,則返回true,如果不是,再判斷b是不是從當前a的根節點的左子節點或右子節點開始的子樹。

(1)hassubtree()函式

嘗試在樹a中查詢樹b根節點的值。

a.首先判斷這兩棵樹有沒有空樹,存在空樹直接返回false。

b.在樹a中查詢樹b根節點的值實質上就是遍歷樹a中的節點,採用常見的遞迴方法,遍歷比較。

c.若在樹a中找到了樹b的根節點,則進行下一步的判斷:能否在樹a中找到以該節點為根節點的相同的子樹結構。

(2)issubtree()函式

a.先判斷哪棵樹先遍歷結束:

若樹b先遍歷完,則代表在樹a找到了與樹b相同的子樹結構,遞迴結束

若樹a先遍歷完,則代表樹a所有節點全部遍歷以後,都沒有找到相同結構,此時同樣遞迴結束

b.判斷樹a中以r為根節點的數值和樹b的根節點數值是否相等:

不相等的話,直接返回false,再回到樹a中遍歷下乙個節點

是的話,再遞迴比較它們各自的左右節點的值是否相同。

# -*- coding:utf-8 -*-

# class treenode:

# def __init__(self, x):

# self.val = x

# self.left = none

# self.right = none

class

solution

:def

hassubtree

(self, proot1, proot2)

:# write code here

ifnot proot1 or

not proot2:

# 判斷有沒有空樹,有就返回false

return

false

result =

false

if proot1.val == proot2.val:

result = self.issubtree(proot1, proot2)

ifnot result:

result = self.issubtree(proot1.left, proot2)

ifnot result:

result = self.issubtree(proot1.right, proot2)

return result

defissubtree

(self, proot1, proot2):if

not proot2:

# 樹2先遍歷完了,表示在樹a中已經找到樹b結構,遞迴結束,返回true

return

true

ifnot proot1:

# 樹1先遍歷完了,表示樹a已經遍歷完了都沒有找到,遞迴結束,返回false

return

false

# 樹1遍歷完了還沒有找到子樹結構,返回false

if proot1.val != proot2.val:

# 比較的兩個子樹的結構根結點不相等返回false,比較下乙個節點

return

false

return self.issubtree(proot1.left, proot2.left)

and self.issubtree(proot1.right, proot2.right)

17 樹的子結構

樹的子結構 輸入兩棵二叉樹a,b,判斷b是不是a的子結構。ps 我們約定空樹不是任何樹的子結構 思路 首先考慮邊界條件 如果樹a為空或者樹b為空,那麼返回值都應為false 然後,判斷兩棵樹的根結點是否相等,如果相等的話,再判斷樹的左子樹以及右子樹是否分別相等 如果一開始兩棵樹的根結點不相等,那麼遞...

17 樹的子結構

輸入兩棵二叉樹a,b,判斷b是不是a的子結構。ps 我們約定空樹不是任意乙個樹的子結構 遞迴思想,如果根節點相同則遞迴呼叫issubtree 如果根節點不相同,則判斷tree1的左子樹和tree2是否相同,再判斷右子樹和tree2是否相同 public class treenode public c...

17 樹的子結構

輸入兩棵二叉樹a,b,判斷b是不是a的子結構。ps 我們約定空樹不是任意乙個樹的子結構 要查詢樹a中是否存在和樹b結構一樣的子樹,我們可以分兩步 第一步在樹a中找到和b的根節點的值一樣的結點r,第二步再判斷樹a中以r為根結點的子樹是不是包含和樹b一樣的結構。以上面的兩棵樹為例來詳細分析這個過程。首先...