# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution(object):
def inorderTraversal(self, root):
"""
:type root: Optional[TreeNode]
:rtype: List[int]
"""
# res = []
# cur = root
# stack = []
# while cur or stack:
# while cur:
# stack.append(cur)
# cur = cur.left
# cur = stack.pop()
# res.append(cur.val)
# cur = cur.right
# return res
# 最容易版本
# if not root:
# return []
# return self.inorderTraversal(root.left) + [root.val] + self.inorderTraversal(root.right)
# 递归通用模板,适应不同题型,添加参数,返回条件,修改进入递归条件,自定义返回值
# def dfs(cur):
# if not cur:
# return
# dfs(cur.left)
# res.append(cur.val)
# dfs(cur.right)
# res=[]
# dfs(root)
# return res
# 迭代的层序遍历
# if not root:
# return []
# cur ,res = [root] , []
# while cur:
# lay ,layval = [],[]
# for node in cur:
# layval.append(node.val)
# if node.left: lay.append(node.left)
# if node.right: lay.append(node.right)
# cur = lay
# res.append(layval)
# return res
# 迭代的前中后序遍历 中序遍历
# cur = root
# stack = []
# res = []
# while cur or stack:
# while cur:
# stack.append(cur)
# cur = cur.left
# cur = stack.pop()
# res.append(cur.val)
# cur = cur.right
# 使用栈的前序遍历
# cur = root
# res ,stack = [], []
# while cur or stack:
# while cur:
# stack.append(cur)
# res.append(cur.val)
# cur= cur.left
# cur = stack.pop()
# cur = cur.right
# return res
# # 后续遍历 先按照右左中的顺序,然后反过来
# cur = root
# res ,stack = [], []
# while cur or stack:
# while cur:
# stack.append(cur)
# res.append(cur.val)
# cur= cur.right
# cur = stack.pop()
# cur = cur.left
# return res[::-1]
# return res
# 标记迭代法 中序遍历
# stack = []
# res = []
# stack.append((0,root))
# while stack:
# flag , cur = stack.pop()
# if not cur: continue
# if flag == 0:
# stack.append((0,cur.right))
# stack.append((1,cur))
# stack.append((0,cur.left))
# else:
# res.appned(cur.val)
# return res
# 莫里斯遍历
#
# res = []
# while root:
# if root.left:
# pre = root.left
# while pre.right:
# pre = pre.right
# pre.right = root
# tmp = root
# root = root.left
# tmp.left = None
# else:
# res.append(root.val)
# root = root.right
# return res
res = []
while root:
if root.left:
pre = root.left
while pre.right:
pre = pre.right
pre.right = root
# 在前序遍历中,首次访问节点时就添加其值
res.append(root.val)
tmp = root
root = root.left
tmp.left = None
else:
# 左指针为空时,除了移动到右子树,也要添加节点值
res.append(root.val)
root = root.right
return res
记住遍历模板,走遍天下都不怕