# 二叉树的递归遍历
注意以下三种写法 :
第一种:
class Solution:
def traversalHelper(self, root, result):
if not root:
return
self.traversalHelper(root.left, result)
result.append(root.val)
self.traversalHelper(root.right, result)
def inorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
result = []
self.traversalHelper(root, result)
return result
第二种:
class Solution:
def traversalHelper(self, root, result):
if root:
self.traversalHelper(root.left, result)
result.append(root.val)
self.traversalHelper(root.right, result)
return result
def inorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
result = []
return self.traversalHelper(root, result)
第二种没什么必要。以上两种写法都可以写成闭包的。
# 二叉树的非递归遍历
使用栈来实现想要的过程。
中序遍历:
class Solution:
def inorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
# 迭代法
if not root:
return []
stack = []
result = []
current = root
while stack or current:
while current:
stack.append(current)
current = current.left
current = stack.pop()
result.append(current.val)
current = current.right
return result
***看起来简单,实际上写起来容易漏洞百出***
此处,我们希望stack为空时停止,但是不希望第一次就停止。使用while stack or current:
可以规避这个问题。
同时,自己写的时候容易犯一个问题,对于从栈中弹出的元素重新获取左侧元素,这会导致重复与死循环。
# 二叉树的统一迭代
标记法,了解思路即可