又是一道二叉樹的題目,核心還是想清楚遞迴和迭代的問題。
之前我們做過還原二叉樹的題目,那道題目的是給出了中序遍歷和前(後)序遍歷,實現還原。簡單複習一下那道題目的思想。利用了中序遍歷的特點,把前後序遍歷一分為二,遞迴解決。
這道題目,給出的條件實際上是先序遍歷,和每個節點對應的深度,並且給出了假設,如果只有乙個節點就一定是左節點。
因此我們就按照先序遍歷的方法,依次構建左節點並存入乙個列表,列表對應的索引其實相當於是深度,然後如果當前節點的深度小於棧的索引,彈出元素到棧頂元素索引+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...