File tree Expand file tree Collapse file tree 1 file changed +38
-0
lines changed Expand file tree Collapse file tree 1 file changed +38
-0
lines changed Original file line number Diff line number Diff line change @@ -303,6 +303,44 @@ class Solution:
303303 return result[::- 1 ]
304304 ```
305305
306+ #### Python 后序遍历的迭代新解法:
307+ * 本解法不同于前文介绍的` 逆转前序遍历调整后的结果 ` ,而是采用了对每个结点直接处理。
308+
309+ ``` python
310+ class Solution :
311+ def postorderTraversal (self , root : Optional[TreeNode]) -> List[int ]:
312+ values = []
313+ stack = []
314+ popped_nodes = set () # 记录值已经被收割了的 nodes
315+ current = root
316+
317+ while current or stack:
318+ if current: # 一次处理完一个结点和他的左右儿子结点,不处理孙子结点,孙子结点由左右儿子等会分别处理。
319+ stack.append(current) # 入栈自己
320+
321+ if current.right:
322+ stack.append(current.right) # 入栈右儿子
323+
324+ if current.left: # 因为栈是后进先出,后序是‘左右中’,所以后加左儿子
325+ stack.append(current.left) # 入栈左儿子
326+
327+ current = None # 会导致后面A处出栈
328+ continue
329+
330+ node = stack.pop() # A处,出的是左儿子,如果无左儿子,出的就是右儿子,如果连右儿子也没有,出的就是自己了。
331+
332+ # 如果 node 是叶子结点,就可以收割了;如果左右儿子都已经被收割了,也可以收割
333+ if (node.left is None or node.left in popped_nodes) and \
334+ (node.right is None or node.right in popped_nodes):
335+ popped_nodes.add(node)
336+ values.append(node.val)
337+ continue
338+
339+ current = node # 不符合收割条件,说明 node 下还有未入栈的儿子,就去入栈
340+
341+ return values
342+ ```
343+
306344### Go:
307345
308346> 迭代法前序遍历
You can’t perform that action at this time.
0 commit comments