当前位置:网站首页>二叉树的遍历(py)
二叉树的遍历(py)
2022-08-09 13:10:00 【花椒酱不吃花椒喵】
前序
# recursively
def preorderTraversal1(self, root):
res = []
self.dfs(root, res)
return res
def dfs(self, root, res):
if root:
res.append(root.val)
self.dfs(root.left, res)
self.dfs(root.right, res)
# iteratively
class Solution:
def preorderTraversal(self, root: TreeNode) -> List[int]:
if not root:
return []
stack,ans=[root],[]
while stack:
node=stack.pop()
ans.append(node.val)
if node.right:
stack.append(node.right)
if node.left:
stack.append(node.left)
return ans
中序
# recursively
def inorderTraversal1(self, root):
res = []
self.helper(root, res)
return res
def helper(self, root, res):
if root:
self.helper(root.left, res)
res.append(root.val)
self.helper(root.right, res)
# iteratively
class Solution:
def inorderTraversal(self, root: TreeNode) -> List[int]:
if not root:
return []
cur,stack,ans=root,[],[]
while stack or cur:
while cur:
stack.append(cur)
cur=cur.left
cur=stack.pop()
ans.append(cur.val)
cur=cur.right
return ans
后序
# recursively
def postorderTraversal1(self, root):
res = []
self.dfs(root, res)
return res
def dfs(self, root, res):
if root:
self.dfs(root.left, res)
self.dfs(root.right, res)
res.append(root.val)
## 标准的后序迭代
class Solution:
def postorderTraversal(self, root: TreeNode) -> List[int]:
res = [] # 用来存储后序遍历节点的值
stack = []
node = root
while stack or node:
while node:
stack.append(node) # 第一次入栈的是根节点
#判断当前节点的左子树是否存在,若存在则持续左下行,若不存在就转向右子树
node = node.left if node.left is not None else node.right
#循环结束说明走到了叶子节点,没有左右子树了,该叶子节点即为当前栈顶元素,应该访问了
node = stack.pop() # 取出栈顶元素进行访问
res.append(node.val) # 将栈顶元素也即当前节点的值添加进res
# (下面的stack[-1]是执行完上面那句取出栈顶元素后的栈顶元素)
if stack and stack[-1].left == node: #若栈不为空且当前节点是栈顶元素的左节点
node = stack[-1].right ## 则转向遍历右节点
else:
node = None # 没有左子树或右子树,强迫退栈
return res
# iteratively2 保存节点遍历状态的迭代,和使用双栈,一个栈放node,一个栈放flag一样
class Solution:
def postorderTraversal(self, root):
traversal, stack = [], [(root, False)]
while stack:
node, visited = stack.pop()
if node:
if visited:
# add to result if visited
traversal.append(node.val)
else:
# post-order
stack.append((node, True))
stack.append((node.right, False))
stack.append((node.left, False))
return traversal
# iteratively3(前序遍历取反,最好不要用)
def postorderTraversal(self, root):
res, stack = [], [root]
while stack:
node = stack.pop()
if node:
res.append(node.val)
stack.append(node.left)
stack.append(node.right)
return res[::-1]
层序
从第一层打印到最后一层
class Solution:
def levelOrder(self, root: TreeNode) -> List[List[int]]:
if not root:
return []
ans=[]
cur_stack=[root]
while cur_stack:
next_stack,tmp=[],[]
for node in cur_stack:
tmp.append(node.val)
if node.left:
next_stack.append(node.left)
if node.right:
next_stack.append(node.right)
cur_stack=next_stack
## 如果是从最后一层打印到第一层,改成ans.insert(0,tmp)就好了
ans.append(tmp)
return ans
边栏推荐
猜你喜欢
随机推荐
pytest 之 fixture的定义及作用域
[MRCTF2020]套娃-1
offset、client、scroll、window.pageYOffset比较
企业公众号开通微信支付
微服务+微信小程序实现社区服务
RTP打包发送H.264
tkiner-canvas显示图片
Q_06_03 表达式
从房产中介到程序员--80后张江男
RobotFramework 之 RF变量与标准库关键字使用
FFMPEG多媒体文件处理(ffmpeg文件的删除与重命名)
Oracle Recovery Tools修复空闲坏块
关于做2D游戏时,Canvas边界显示在Game窗口的问题
render解析
快来扔鸡蛋。
音频基础学习——声音的本质、术语与特性
RobotFramework 之 Evaluate
昇腾AI开发者创享日南京站!一起CANN机器狗+AI机械臂实现硬核智慧救援!燃爆现场~
机器学习web服务化实战:一次吐血的服务化之路 (转载非原创)
Professor Chen Qiang "application in machine learning and R" course chapter 17





![[极客大挑战 2019]Upload](/img/ed/062a89797c790189d9bd77b50335b0.png)



