Leetcode 742 二叉樹最近的葉子結點

2021-09-27 09:26:45 字數 2450 閱讀 1505

time: 20190924

type: medium

給定乙個 每個結點的值互不相同 的二叉樹,和乙個目標值 k,找出樹中與目標值 k 最近的葉結點。

這裡,與葉結點 最近 表示在二叉樹中到達該葉節點需要行進的邊數與到達其它葉結點相比最少。而且,當乙個結點沒有孩子結點時稱其為葉結點。

在下面的例子中,輸入的樹以逐行的平鋪形式表示。實際上的有根樹 root 將以treenode物件的形式給出。

示例 1:

輸入:root = [1, 3, 2], k = 1

二叉樹圖示:

1

/ \ 3

2

輸出: 2 (或 3)

解釋: 2 和 3 都是距離目標 1 最近的葉節點。

示例 2:

輸入:root = [1], k = 1

輸出:1

解釋: 最近的葉節點是根結點自身。

示例 3:

輸入:root = [1,2,3,4,null,null,null,5,null,6], k = 2

二叉樹圖示:

1

/ \ 23/

4/5/

6

輸出:3

解釋: 值為 3(而不是值為 6)的葉節點是距離結點 2 的最近結點。

注:root 表示的二叉樹最少有 1 個結點且最多有 1000 個結點。

每個結點都有乙個唯一的 node.val ,範圍為 [1, 1000]。

給定的二叉樹中有某個結點使得 node.val == k。

思路也是先用dfs將樹轉換為鄰接表表示的圖,本題和863的區別在於兩個方面:

一定要加visited標記,否則會陷入死迴圈。

注意用列表模擬佇列的寫法:

左邊是隊尾,右邊是隊首。

# definition for a binary tree node.

# class treenode:

# def __init__(self, x):

# self.val = x

# self.left = none

# self.right = none

class

solution

:def

findclosestleaf

(self, root: treenode, k:

int)

->

int:

isleaf =

[false]*

1001

# 至多1000個結點

from collections import defaultdict

g = defaultdict(

set)

# dfs遍歷建圖

defdfs

(root)

:# print("...")

if root !=

none

and root.left ==

none

and root.right ==

none

:# print("是葉子結點...")

isleaf[root.val]

=true

if root.left:

g[root.val]

.add(root.left.val)

g[root.left.val]

.add(root.val)

dfs(root.left)

if root.right:

g[root.val]

.add(root.right.val)

g[root.right.val]

.add(root.val)

dfs(root.right)

# 執行建圖過程

dfs(root)

# bfs查詢距離目標值結點最近的葉子結點

visited =

que =

[k]# 模擬佇列

while

len(que)!=0

: top = que.pop(

)if isleaf[top]

:return top

for val in g[top]

:if val not

in visited:

if isleaf[val]

:return val

que.insert(

0, val)

visited.add(val)

return

-1

2019.10 update:

end.

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 方法一 遞迴 思路 如果乙個樹的左子樹與右子樹映象對稱,則該樹是對稱的 兩個樹互為映象的...

LeetCode (二叉樹)反轉二叉樹

遞迴交換每乙個節點的左右子樹,重點在於訪問每乙個節點,然後交換左右子樹 definition for a binary tree node.struct treenode struct treenode inverttree struct treenode root 由於至少要講每乙個節點都訪問一次...

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說明 如果你可以運用遞迴和迭代兩種方法解決這個問題,會很加分。遞迴 definit...