每日一同 先序遍歷還原二叉樹

2021-10-07 07:31:22 字數 1340 閱讀 3193

又是一道二叉樹的題目,核心還是想清楚遞迴和迭代的問題。

之前我們做過還原二叉樹的題目,那道題目的是給出了中序遍歷和前(後)序遍歷,實現還原。簡單複習一下那道題目的思想。利用了中序遍歷的特點,把前後序遍歷一分為二,遞迴解決。

這道題目,給出的條件實際上是先序遍歷,和每個節點對應的深度,並且給出了假設,如果只有乙個節點就一定是左節點。

因此我們就按照先序遍歷的方法,依次構建左節點並存入乙個列表,列表對應的索引其實相當於是深度,然後如果當前節點的深度小於棧的索引,彈出元素到棧頂元素索引+1==深度,構建右節點。

# definition for a binary tree node.

# class treenode:

# def __init__(self, x):

# self.val = x

# self.left = none

# self.right = none

class

solution

:def

recoverfrompreorder

(self, s:

str)

-> treenode:

path, i =

,0while i<

len(s)

:# 統計節點的深度

dep =

0while s[i]

=='-'

: dep +=

1 i +=

1# 得到節點的數值

val =

0while i<

len(s)

and s[i]

.isdigit():

val = val*10+

int(s[i]

) i +=

1 node = treenode(val)

# 如果深度等於棧頂元素的索引,新增左節點,否則右節點

if dep ==

len(path)

:if path:

path[-1

].left = node

else

: path = path[

:dep]

path[-1

].right = node

return path[

0]

先序構建二叉樹及先序遍歷二叉樹

先序為dlr d 根節點,l 左子樹,r 右子樹 a b c d e 先序序列為abdce,輸入為abd c e 表示空格,代表空樹 輸入按滿二叉樹輸入 每乙個節點都是乙個子樹的根節點 void pre create tree treenode t else else void pre visit ...

先序構建二叉樹及先序遍歷二叉樹

先序為dlr d 根節點,l 左子樹,r 右子樹 a b c d e 先序序列為abdce,輸入為abd c e 表示空格,代表空樹 輸入按滿二叉樹輸入 每乙個節點都是乙個子樹的根節點 void pre create tree treenode t else else void pre visit ...

二叉樹的先序遍歷

二叉樹先序遍歷遵循 訪問根結點 遍歷其左子樹 遍歷其右子樹 簡單來說就是根 左樹 左樹的左樹 左樹的左樹的左樹 一直遍歷到沒有左樹為止 右樹 如果沒沒有右樹就往上 一直遍歷到右樹的右樹也沒有了 就結束了 class treenode object 初始化樹的 def init self,data 0...