樹 03 樹的題目解析

2022-06-17 14:42:15 字數 4331 閱讀 7550

劍指 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棵二叉樹樹的資訊。對...