这道题前、中、后序遍历用栈来做特别简单,本质上属于迭代的一种,敲代码时一定要注意栈First in, last out的特点,千万别写反了。放张图理解一下:
Status用作标志,True的话就是说你回头可以直接去结果res里了;False的话就是说你先去栈Stack里好好待着吧。
1.前序遍历(根、左、右)
class Solution:
def preorderTraversal(self, root: TreeNode) -> List[int]:
if not root:return []
stack=[(root,False)]
res=[]
while stack:
cur,status=stack.pop()
if status:
res.append(cur.val)
else:
if cur.right:stack.append((cur.right,False))
if cur.left:stack.append((cur.left,False))
stack.append((cur,True)) #前、中、后序的差别只在于这句话放置的位置
return res
2.中序遍历(左、根、右)
class Solution:
def inorderTraversal(self, root: TreeNode) -> List[int]:
if not root:return []
stack=[(root,False)]
res=[]
while stack:
cur,status=stack.pop()
if status:
res.append(cur.val)
else:
if cur.right:stack.append((cur.right,False))
stack.append((cur,True)) #前、中、后序的差别只在于这句话放置的位置
if cur.left:stack.append((cur.left,False))
return res
3.后序遍历(左、右、根)
class Solution:
def postorderTraversal(self, root: TreeNode) -> List[int]:
if not root:return []
stack=[(root,False)]
res=[]
while stack:
cur,status=stack.pop()
if status:
res.append(cur.val)
else:
stack.append((cur,True)) #前、中、后序的差别只在于这句话放置的位置
if cur.right:stack.append((cur.right,False))
if cur.left:stack.append((cur.left,False))
return res
4、层次遍历
用队列来做,即First in,first out. 比上面三种遍历稍微好理解点儿~
class Solution:
def levelOrder(self, root: TreeNode) -> List[List[int]]:
if not root:return []
queue=[(root,0)]
res=[]
while queue:
node,level=queue.pop(0) #一定要注意pop()是栈的专属操作,即取出并删除最后一个元素;
#而pop(0)才是队列的专属操作,即取出并删除第一个元素。
if len(res)!=level+1:
res.append([])
res[level].append(node.val)
if node.left:
queue.append((node.left,level+1))
if node.right:
queue.append((node.right,level+1))
return res