劍指 offer 55 - ii. 平衡二叉樹/110. 平衡二叉樹
劍指 offer 26. 樹的子結構 (中等難度)
劍指 offer 68 - i. 二叉搜尋樹的最近公共祖先
劍指 offer 68 - ii. 二叉樹的最近公共祖先/236. 二叉樹的最近公共祖先
劍指 offer 36. 二叉搜尋樹與雙向鍊錶
輸入一棵二叉樹的根節點,判斷該樹是不是平衡二叉樹。如果某二叉樹中任意節點的左右子樹的深度相差不超過1,那麼它就是一棵平衡二叉樹。
示例 1:
給定二叉樹 [3,9,20,null,null,15,7]
3/ \
9 20
/ \
15 7
返回 true 。
classsolution: #
注意呼叫函式時,需要用
self
,若是巢狀型別的方法定義,則不需要
defisbalanced(self, root: treenode) -> bool:
ifnotroot :returntrue
if(abs(self.height(root.left)-self.height(root.right))>1):
returnfalse
else:
returnself.isbalanced(root.left) andself.isbalanced(root.right)
defheight(self,root):
ifnotroot : return0
return1+ max(self.height(root.left),self.height(root.right))
輸入兩棵二叉樹a和b,判斷b是不是a的子結構。(約定空樹不是任意乙個樹的子結構)
b是a的子結構, 即 a中有出現和b相同的結構和節點值。
例如:給定的樹 a:
3/ \
4 5
/ \1 2
給定的樹 b:4 /
1返回 true,因為 b 與 a 的乙個子樹擁有相同的結構和節點值。
示例 1:
輸入:a = [1,2,3], b = [3,1]
輸出:false
示例 2:
輸入:a = [3,4,5,1,2], b = [4,1]
輸出:true
classsolution:
defissubstructure(self, a: treenode, b: treenode) -> bool:
defrecur(a,b):
ifnotb :returntrue
ifnota ora.val != b.val :returnfalse
returnrecur(a.left,b.left) andrecur(a.right,b.right)
returnbool(a andb) and(recur(a,b) orself.issubstructure(a.left,b) orself.issubstructure(a.right,b))
給定乙個二叉搜尋樹, 找到該樹中兩個指定節點的最近公共祖先。
例如,給定如下二叉搜尋樹: root = [6,2,8,0,4,7,9,null,null,3,5]
示例 1:
輸入: root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q = 8
輸出: 6
解釋: 節點 2 和節點 8 的最近公共祖先是 6。
示例 2:
輸入: root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q = 4
輸出: 2
解釋:節點 2 和節點 4 的最近公共祖先是 2, 因為根據定義最近公共祖先節點可以為節點本身。
classsolution:
deflowestcommonancestor(self, root: 'treenode', p: 'treenode', q: 'treenode') -> 'treenode':
ifnotroot :returnnone
ifp.val > q.val : #
保證p.val
p,q = q,p
whileroot :
ifroot.val
都在root
的右子樹中
root = root.right #
遍歷至右子節點
ifroot.val > q.val:
root = root.left
else:
break
returnroot
給定乙個二叉樹, 找到該樹中兩個指定節點的最近公共祖先。
例如,給定如下二叉樹: root = [3,5,1,6,2,0,8,null,null,7,4]
示例 1:
輸入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1
輸出: 3
解釋: 節點 5 和節點 1 的最近公共祖先是節點 3。
示例 2:
輸入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 4
輸出: 5
解釋: 節點 5 和節點 4 的最近公共祖先是節點 5。因為根據定義最近公共祖先節點可以為節點本身。
輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換成乙個排序的迴圈雙向鍊錶。要求不能建立任何新的節點,只能調整樹中節點指標的指向。
大體思路要清楚:框架是中序遍歷,寫好中間部分即可:設定兩個pre和cur,pre若為空,設定下頭結點;不空,則進行互相指定。
不要忘記最後的head與最後的指定。
"""# definition for a node.
class node:
def __init__(self, val, left=none, right=none):
self.val = val
self.left = left
self.right = right
"""classsolution:
deftreetodoublylist(self, root: 'node') -> 'node':
defdfs(cur):
ifnotcur :return
dfs(cur.left)
ifself.pre: #
不為空,則互相指定
self.pre.right,cur.left = cur ,self.pre
else: #
為空,記錄頭結點,這個走一遍
self.head = cur
self.pre = cur #
儲存後進行下一步推進
dfs(cur.right)
ifnotroot :return
self.pre = none
dfs(root)
self.head.left,self.pre.right = self.pre,self.head
returnself.head
【1】
03 樹1 樹的同構
圖1 圖2現給定兩棵樹,請你判斷它們是否是同構的。輸入給出2棵二叉樹樹的資訊。對於每棵樹,首先在一行中給出乙個非負整數n 10 即該樹的結點數 此時假設結點從0到n 1編號 隨後 n行,第 i行對應編號第 i個結點,給出該結點中儲存的1個英文大寫字母 其左孩子結點的編號 右孩子結點的編號。如果孩子結...
03 樹1 樹的同構
include define tree int define maxsize 10 define null 1 struct treenodet1 maxsize t2 maxsize tree builttree struct treenode t int isomorphic tree r1,t...
03 樹1 樹的同構
給定兩棵樹t1和t2。如果t1可以通過若干次左右孩子互換就變成t2,則我們稱兩棵樹是 同構 的。例如圖1給出的兩棵樹就是同構的,因為我們把其中一棵樹的結點a b g的左右孩子互換後,就得到另外一棵樹。而圖2就不是同構的。圖1 圖2現給定兩棵樹,請你判斷它們是否是同構的。輸入給出2棵二叉樹樹的資訊。對...