今天在做LeetCode的二叉树前序遍历题的时候,我看到题目是这样的:
我当时就不乐意了,你这也太高看我了,什么叫递归方法很简单?没想到我递归方法我也不会吧
经过我冥思苦想终于把以前学数据结构的时候记忆拿回来了
其实真的很简单,如下:
# 前序
def preorderTraversal(self, root):
if root is None: return []
out = [root.val]
out.extend(self.preorderTraversal(root.left))
out.extend(self.preorderTraversal(root.right))
return out
# 中序
def preorderTraversal(self, root):
if root is None: return []
out.extend(self.preorderTraversal(root.left))
out = [root.val]
out.extend(self.preorderTraversal(root.right))
return out
# 后序
def preorderTraversal(self, root):
if root is None: return []
out.extend(self.preorderTraversal(root.left))
out.extend(self.preorderTraversal(root.right))
out = [root.val]
return out
这不是我这篇文章的重点,这只是前戏,还有就是递归真的很简单,我就不解释了
题目都说递归很简单了,让我用迭代的方法,那么我怎么能示弱呢?
于是我想破我的小脑袋瓜也还是没有想出来,于是我看了题解。。。终于悟到其中的奥妙
接着就有了下面的代码
def preorderTraversal(self, root):
if root is None:
return []
out = []
stack = [root]
while stack:
root = stack.pop()
if root:
out.append(root.val)
stack.append(root.right)
stack.append(root.left)
return out
这也很简单,几乎就和官方题解一模一样,也没什么好解释的吧,但是我把这个方法理解之后看到一个C++大佬的题解说改变一行代码就实现前序、中序、后序的迭代遍历,反正具体的代码我也没看,我就想我用Python来实现一个
于是我就想了想
因为栈是先进后出,前序遍历是根、左、右
# 前序遍历
stack.append(root.right)
stack.append(root.left)
stack.append(root.val)
同理
# 中序遍历
stack.append(root.right)
stack.append(root.val)
stack.append(root.left)
再次同理
# 中序遍历
stack.append(root.val)
stack.append(root.right)
stack.append(root.left)
综上
前序遍历
def preorderTraversal(self, root):
if root is None:
return []
t = type(root) # 保存树的类型
out = [] # 初始化输出数组
stack = [root] # 将树压入栈中
while stack: # 循环栈
root = stack.pop() # 根节点等于出栈的节点
if type(root) != t and root is not None: # 如果此时root不为树并且不为空
out.append(root) # 将这个数加入输出数组中
continue # 结束本次循环
if root: # 如果此时root是树
stack.append(root.right) # 将右孩子压入栈
stack.append(root.left) # 将左孩子压入栈
stack.append(root.val) # 将根的值压入栈
return out
中序遍历
def preorderTraversal(self, root):
if root is None:
return []
t = type(root)
out = []
stack = [root]
while stack:
root = stack.pop()
if type(root) != t and root is not None:
out.append(root)
continue
if root:
stack.append(root.right)
stack.append(root.val) # 中序遍历
stack.append(root.left)
return out
后序遍历
def preorderTraversal(self, root):
if root is None:
return []
t = type(root)
out = []
stack = [root]
while stack:
root = stack.pop()
if type(root) != t and root is not None:
out.append(root)
continue
if root:
stack.append(root.val) # 后序遍历
stack.append(root.right)
stack.append(root.left)
return out
以上就是我的思路和理解。
从本质上来说,递归遍历二叉树和迭代遍历二叉树都是一样的,递归遍历二叉树是程序帮我们管理栈,迭代遍历二叉树是我们手动去维护栈。
Python改变一行代码实现二叉树前序、中序、后序的迭代遍历
原文:https://www.cnblogs.com/nanke33/p/13435033.html