思路一:
#这个思路利用了:根右左的顺序遍历二叉树,反过来就是 左右根 即后序遍历了
class Solution(object):
def postorderTraversal(self, root):
stack, res = [], []
while stack or root:
if root:
stack.append(root)
res.append(root.val)
print(res)
root = root.right #先加右边,在左边。
else:
node = stack.pop()
root = node.left
return res[::-1] #返回Reversed的list 左右根 根右左
图解代码运行过程:
思路二:
#原理相同,都是反向列表,但是操作不同的,这里的理解上的差别是什么了。
class Solution(object):
def postorderTraversal(self, root):#这里就是单纯利用栈的存储顺序,没有用左右结点的关系
ans, stack = [], [root]
while stack:
tmp = stack.pop()
if tmp:
ans.append(tmp.val)
stack.append(tmp.left)
stack.append(tmp.right)#根右左
print(stack)
return ans[::-1]
Your input
[1,null,2,3]
stdout#虽然具体元素不清楚,但还是可以通过这里的数据变化来理解遍历过程
[None, <precompiled.treenode.TreeNode object at 0x7f458af42f60>]
[None, <precompiled.treenode.TreeNode object at 0x7f458af42f98>, None]
[None, None, None]#跳出循环
Output
[3,2,1]
Diff
Expected
[3,2,1]
图解代码运行过程:
思路三:
#这里之所以不要反转,是因为加入元素时的位置改变了,不是在后面加,而是在前面加
from collections import deque
class Solution:
def postorderTraversal(self, root):
"""
:type root: TreeNode
:rtype: List[int]
"""
if not root:#为空
return []
stack, postorder = [root], deque()
while stack:#没有利用反序,直接来
current = stack.pop()
postorder.appendleft(current.val)
stack.append(current.left)
if current.right:
stack.append(current.right)
print(postorder)
return list(postorder)
图解代码运行过程:
座右铭:站在别人的思想上,看见自己的不足,传播错误的经验,愿君不重蹈覆辙。
由于受限于本人经验,难免不足,如有建议,欢迎留言交流。
说明:
1.上面的图解步骤是本人在脑海中演算的,与当时的思考情况,仅仅作为理解的参考。
2.箭头代表了运行方向,数字代表了运行顺序。
3.之所以做这个,是因为本人对于二叉树的理解只能停留在“表面理解上”,对于里面究竟是怎么遍历的不清楚,所以就以题目给的例子,做了图解运行过程。
4.如果对您有帮助,请点赞,您的鼓励是本人前进的最好动力。
5.这里由于是对以前本人不理解代码的重新理解,所以省略了很多内容说明,详情请见本人博客链接。https://blog.csdn.net/qq_41827968/article/details/89458702