题目
给定一个二叉树的根节点 root ,返回 它的中序 遍历 。
代码
方法一:递归

bash
class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
class Solution:
def inorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
result = []
def traverse(node: Optional[TreeNode]):
if not node:
return
traverse(node.left) # 递归左子树
result.append(node.val) # 访问根节点
traverse(node.right) # 递归右子树
traverse(root)
return result
方法二:迭代
使用栈来代替左节点的递归
bash
class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
class Solution:
def inorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
res=[]
stack=[]
cur=root
while cur or stack:
while cur :
stack.append(cur)
cur=cur.left
cur=stack.pop()
res.append(cur.val)
cur=cur.right
return res
方法三:颜色标记
这是评论区中的一个方法,在每个节点之前使用1来标记节点是否每个子树的根节点,0标记每个子树的左右节点。
通过改变节点入栈的顺序来确定二叉树的遍历方法。因为栈具有先进后出的特点,所以在进行中序遍历的时候是右、中、左节点先后入栈,因为出栈的时候是左、中、右出栈。
bash
class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
class Solution:
def inorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
WHITE,GRAY=0,1
res=[]
stack=[(WHITE,root)]
while stack:
color,node=stack.pop()
if node is None:continue
if color==WHITE:
stack.append((WHITE,node.right))
stack.append((GRAY,node))
stack.append((WHITE,node.left))
else:
res.append(node.val)
return res