輸入兩棵二叉樹a,b,判斷b是不是a的子結構。
我們規定空樹不是任何樹的子結構。
樣例樹a:
樹b:
返回 true ,因為b是a的子結構。
1、由於對於一棵樹的描述是給出其根節點,所以判斷一棵樹是否為另外一棵樹的子樹,首先就是判斷兩樹的根節點是否一致。在對比過程中,如果發現a樹的根節點和b樹的根節點不一致,則需要找到a根節點的子孫節點接著與b的根節點進行比較,這裡就想到利用遞迴遍歷一棵樹的所有節點。這裡需要遍歷的是a的所有節點
2、對於找到根節點相同的情況,則需要判斷兩棵樹是否有相同的結構,這裡就需要同時利用遞迴判斷兩棵樹的所有節點是否相同(在同為根節點或左孩子或右孩子時)
3、綜上所述,解出此題需要構造兩個遞迴函式,乙個遞迴函式實現對a與b和a的子樹與b進行比較,另乙個函式實現兩樹是否具有相同的結構
# definition for a binary tree node.
# class treenode(object):
# def __init__(self, x):
# self.val = x
# self.left = none
# self.right = none
class
solution
(object):
defhassubtree
(self, proot1, proot2)
:"""
:type proot1: treenode
:type proot2: treenode
:rtype: bool
"""if proot1 ==
none
or proot2 ==
none
:return
false
if self.ispart(proot1, proot2)
:# 樹的結構是否相同
return
true
else
:# 遞迴實現子樹與b的比較
return self.hassubtree(proot1.left, proot2)
or self.hassubtree(proot1.right, proot2)
defispart
(self, root1, root2)
:if root2 is
none
:return
true
if root1 is
none
:return
false
if root1.val == root2.val:
# 若根節點相同則繼續判斷子節點是否也相同 # 遞迴實現
return self.ispart(root1.left, root2.left)
and self.ispart(root1.right, root2.right)
else
:return
false
樹的子結構
題目 輸入兩顆二叉樹a和b 判斷b是不是a的子結構 二叉樹結點定義如下 首先 從樹根開始遍歷樹 如果結點與 b的根結點值相同 則繼續遍歷a的左子樹 以及b的左子樹 如果左子樹相同則遍歷a的右子樹以及b的左子樹 如果左右子樹都相同則 a包含b 如果結點與b的根節點值不同 則遍歷到a的左孩子 重複上述判...
樹的子結構
來自 劍指offer 的面試題18。題目 輸入兩棵二叉樹a和b,判斷b是不是a的子結構。二叉樹節點定義如下 public class treenode 思路分析 首先,在tree1中找到和tree2的根節點的值一樣的結點r 然後,再判斷tree1中以r為根結點的子樹是不是包含和tree2一樣的結構。...
樹的子結構
輸入兩顆二叉樹a,b,判斷b是不是a的子結構 思路 1 先判斷兩棵樹是否為空,是則沒有子樹 2 當兩棵樹為非空時,判斷當前的兩個根節點是否為子樹關係,若值相等,則繼續判斷左右子樹是否也對應相等 3 當根節點非子樹關係時,再判斷a樹的左右子樹和b樹是否有子樹。public class treenode...