先序遍历preorder
class Solution:
def preorderTraversal(self, root: TreeNode) -> List[int]:
res = []
stack = []
node = root
if not root:
return res
while stack or node:
while node:
res.append(node.val)
stack.append(node)
node = node.left
node = stack.pop()
node = node.right
return res
后序遍历postorder
postorder traveral因为需要模板化,因此参考前序遍历:根左右
过程:
- 把根左右 ->根右左(这里只需要把left改成right,right改成left即可)
- 再把根右左reverse->左右根
class Solution:
def postorderTraversal(self, root: TreeNode) -> List[int]: #根右左 -> 左右跟
res = []
if not root:
return res
stack = []
node = root
while node or stack:
while node:
res.append(node.val)
stack.append(node)
node = node.right
node = stack.pop()
node = node.left
return res[::-1]
中序遍历inorder
与preorder不一样代码只有res.append(node)的位置不同,这里很好理解,想想递归栈的访问先左访问完再访问中,最后是右
class Solution:
def inorderTraversal(self, root: TreeNode) -> List[int]:
res = []
if not root:
return res
stack = []
node = root
while node or stack:
while node:
stack.append(node)
node = node.left
node = stack.pop()
res.append(node.val)
node = node.right
return res