94.二叉树的中序遍历
给定一个二叉树的根节点
root
,返回它的 中序 遍历
详细讲解见leetcode官方
二叉树的python定义:
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: TreeNode) -> List[int]:
if not root:
return []
res = []
res.extend(self.inorderTraversal(root.left))
res.append(root.val)
res.extend(self.inorderTraversal(root.right))
return res
解法②:迭代
class Solution:
def inorderTraversal(self, root: TreeNode) -> List[int]:
def add_all_left(node):
while node:
stack.append(node)
node = node.left
stack, res = [], []
add_all_left(root)
while stack:
cur = stack.pop()
res.append(cur.val)
add_all_left(cur.right)
return res
解法③:morris(即将二叉树转换为链表,即每一个node都只可能有右孩子)
class Solution:
def inorderTraversal(self, root: TreeNode) -> List[int]:
res = []
while root:
if root.left:
# find out predecessor
predecessor = root.left
while predecessor.right:
predecessor = predecessor.right
# link predecessor to root
predecessor.right = root
# set left child of root to None
temp = root
root = root.left
temp.left = None
else:
res.append(root.val)
root = root.right
return res