二叉树的前序遍历-力扣
二叉树的中序遍历-力扣
二叉树的后序遍历-力扣
前序遍历-迭代法
中左右,访问顺序和处理顺序一致,都是中间结点,可以先把中间结点入栈
因为栈后进先出,入栈时,先把右孩子入栈,再把左孩子入栈
class solution:
def preorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
#迭代法-栈
if not root:
return []
stack=[root]
res=[]
while stack:
node=stack.pop()
res.append(node.val)
#栈先进后出,想要中左右,右孩子先进栈
if node.right:
stack.append(node.right)
if node.left:
stack.append(node.left)
return res
中序遍历-迭代法
左中右,访问顺序是从根节点开始,处理顺序是从左节点开始,不一致,此时中间结点先不入栈,先通过指针访问到最左节点,再用栈来放置结点
class Solution:
def inorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
#迭代法-左中右
if not root:
#为空处理
return []
res=[]
stack=[]
cur=root
while cur or stack:
#先通过指针访问最左节点
if cur:
stack.append(cur)
cur=cur.left
else:
#到达最左节点后,处理栈顶结点
cur=stack.pop()
res.append(cur.val)
#取栈顶右结点
cur=cur.right
return res
后序遍历-迭代法
左右中
先序遍历中左右->调整代码左右循环:中右左->反转res数组:左右中
因此,后序遍历代码可通过调整先序遍历代码可得:先root,再左节点入栈,再右节点入栈;出栈变成中右左
class Solution:
#迭代法
def postorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
if not root:
return []
res=[]
stack=[root]
while stack:
#空节点不入栈
node=stack.pop()
#中节点先处理
res.append(node.val)
#左节点先入栈,与前序相反
if node.left:
stack.append(node.left)
#右节点后入栈
if node.right:
stack.append(node.right)
#出栈后,res里是中右左,反转res后,是左右中
return res[::-1]