94 二叉树的中序遍历
给定一个二叉树的根节点 root
,返回 它的 中序 遍历 。
输入:root = [1,null,2,3]
输出:[1,3,2]
输入:root = [1]
输出:[1]
就是先递归左子树,然后把此时的root值添加进来,然后再去递归右子树。
# Definition for a binary tree node.
# 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 traversal(root):
# if root == None:
# return
# traversal(root.left)
# result.append(root.val)
# traversal(root.right)
# traversal(root)
# return result
#非递归
if root == None:
return []
result = []
cur = root
stack = []
while cur or stack:
if cur:
stack.append(cur)
cur = cur.left
else:
cur = stack.pop()
result.append(cur.val)
cur = cur.right
return result# Definition for a binary tree node.
# 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 traversal(root):
# if root == None:
# return
# traversal(root.left)
# result.append(root.val)
# traversal(root.right)
# traversal(root)
# return result
#非递归
if root == None:
return []
result = []
cur = root
stack = []
while cur or stack:
if cur:
stack.append(cur)
cur = cur.left
else:
cur = stack.pop()
result.append(cur.val)
cur = cur.right
return result
#使用一个框架的非递归代码
result = []
stack = []
if root:
stack.append(root)
while stack:
node = stack.pop()
if node != None:
if node.right:
stack.append(node.right)
stack.append(node)
stack.append(None)
if node.left:
stack.append(node.left)
else:
node = stack.pop()
result.append(node.val)
return result
首先一路向左,把所有左子树的节点值都放进栈中, 直到指针的左孩子为空时,节点就为当前栈顶弹出的第一个元素,把当前值添加进root,再去找当前这个节点的右孩子,右孩子也为空的时候,栈再弹出一个新元素,直到所有栈元素最后弹出为空结束。