這道題給出二叉樹root,x和y,要解決的問題是在樹中找到x和y,並且確定它們是否為堂兄弟節點的關係。
佇列實現、bfs
廣度優先遍歷每一層,存入佇列中,判斷x和y是否在同一層,如果在,就是判斷是否為堂兄弟節點。在同一層中,只有相鄰節點並且右邊的節點的索引為奇數、左邊節點索引為偶數時,才是同乙個父節點。如果不滿足上面條件,則就是堂兄弟節點
遞迴dfs
深度優先搜尋標記每乙個節點,對於每個節點,都儲存它的父親節點和深度到對應的字典中,最後判斷x和y在這兩個字典中的值就可以了
bfs法
class
treenode
:def
__init__
(self, val=
0, left=
none
, right=
none):
self.val = val
self.left = left
self.right = right
class
solution
(object):
defiscousins
(self,root,x,y)
: ans =
[root]
while ans:
tmp =
# 儲存本層的所有值
n =len(ans)
# 每次迴圈拿一層的陣列
for i in
range
(n):
#這個迴圈把所有節點值存入tmp,然後ans存入每個點的左右孩子
r = ans.pop(0)
#每乙個節點
if r:
#秘訣在這裡,把左右孩子放回去
else
:none
)#如果是空結點,方便判斷是否為同一父節點
print
(tmp)
if x in tmp and y in tmp:
left = tmp.index(x)
#獲取x的索引位置
right = tmp.index(y)
if left>right:
# l比r大,調整一下,方便判斷,保證r比l大
left,right=right,left
if right-
1== left and right%2!=
0:#只有l,r相鄰並且r為奇數時(l為偶數),才是同一父節點
return
false
return
true
return
false
t = treenode(val=
1,left=treenode(val=
2,left=treenode(4)
,right=treenode(5)
),right=treenode(val=
3,left=treenode(6)
,right=treenode(7)
))s = solution(
)s.iscousins(t,5,
7)
dfs遞迴class
solution
(object):
defiscousins
(self,root,x,y)
: parent =
#節點的值對應它的parent
depth =
# 節點值對應它的深度
defdfs
(node,par=
none):
if node:
depth[node.val]=1
+ depth[par.val]
if par else
0 parent[node.val]
= par
dfs(node.left,node)
dfs(node.right,node)
dfs(root)
return depth[x]
==depth[y]
and parent[x]
!= parent[y]
復 雜度
分析
:\color
複雜度分析:
bfs
dfs
LeetCode 993 二叉樹的堂兄弟節點
題目 在二叉樹中,根節點位於深度 0 處,每個深度為 k 的節點的子節點位於深度 k 1 處。如果二叉樹的兩個節點深度相同,但父節點不同,則它們是一對堂兄弟節點。我們給出了具有唯一值的二叉樹的根節點 root,以及樹中兩個不同節點的值 x 和 y。只有與值 x 和 y 對應的節點是堂兄弟節點時,才返...
Leetcode 993二叉樹的堂兄弟節點
在二叉樹中,根節點位於深度 0 處,每個深度為 k 的節點的子節點位於深度 k 1 處。如果二叉樹的兩個節點深度相同,但父節點不同,則它們是一對堂兄弟節點。我們給出了具有唯一值的二叉樹的根節點 root,以及樹中兩個不同節點的值 x 和 y。只有與值 x 和 y 對應的節點是堂兄弟節點時,才返回 t...
leetcode 二叉樹 對稱二叉樹
給定乙個二叉樹,檢查它是否是映象對稱的。例如,二叉樹 1,2,2,3,4,4,3 是對稱的。1 2 2 3 4 4 3 但是下面這個 1,2,2,null,3,null,3 則不是映象對稱的 1 2 2 3 3 方法一 遞迴 思路 如果乙個樹的左子樹與右子樹映象對稱,則該樹是對稱的 兩個樹互為映象的...