(python) leetcode刷题——binary-tree-postorder-traversal

这篇博客主要介绍了如何使用Python来实现二叉树的后序遍历,包括递归法和迭代法的详细解析。通过具体例子展示了迭代法的过程,解释了借助辅助栈如何进行入栈和出栈操作,最终得到后序遍历的结果。
摘要由CSDN通过智能技术生成

题目:
Given a binary tree, return the postorder traversal of it’s nodes’ values.
For example:
Given binary tree{1,#,2,3},
1

2
/
3
return[3,2,1].
Note: Recursive solution is trivial, could you do it iteratively?

解析:
这道题需要分别运用两个方法:递归法、迭代法去实现。首先明确一下二叉树的后序遍历是先左后右再根的顺序。

递归法:
递归法很简单,对于根节点,先遍历左子树,再遍历右子树,最后遍历自己,递归来看,对于左子树,也存在根节点,进一步按照后序遍历的顺序去做,同理右子树也是如此。

迭代法:
例子——
二叉树
迭代法需要借助辅助栈,借助栈的先进后出特点去进行入栈出栈操作。
1)根节点(8)入栈,再按照先右后左入栈,如果左孩子还有左孩子或者右孩子,那么继续按先右后左的顺序入栈。则入栈为:8,9,3,5,2,到2后没有左右孩子,停止入栈;
2)由于2没有左右孩子,则用prev记录一下,再将2出栈,再继续判断5,同样出栈,并用prev记录,再到3,由于prev记录的5是它的右孩子,说明3的孩子已经遍历结束,因此将3也出栈,并将prev记录为3,综上,出栈依次为:2,5,3,栈内为:8,9,prev为3;
3)由于prev记录的3不为栈顶9的孩子结点,因此继续遍历9的孩子,做入栈操作,顺序仍然是先右后左,则入栈后为:8,9,12,34,10,到10后没有左右孩子,结束入栈,同2)中步骤,10出栈,prev记录的10不是34的孩子结点,继续入栈,栈内为:8,9,12,34,23,到23没有左右孩子,结束入栈。
4)栈顶23出栈,prev记录为23,是34的左孩子,因此34孩子遍历结束34出栈,prev为34,同理12、9、8依次出栈。
综合上述步骤出栈顺序为:2,5,3,10,23,34,12,9,8,即为后序遍历结果。

全部代码:

class treenode():
    def __init__(self,left = None,right = None,value = None):
        self.value = value
        self.left = left
        self.right = right
    def settag(self,tag = None):
        self.tag = tag

def insertnode(root,treenode):
    tmp = root
    if (root == None): 
        root = treenode
    while(tmp != None):
        if(treenode.val == tmp.val):
            break
        elif(treenode.val <= tmp.val):
            if(tmp.left != None):
                tmp = tmp.left
            else:
                tmp.left = treenode
        else:
            if(tmp.right != None):
                tmp = tmp.right
            else:
                tmp.right = treenode
    return root

def trivialnode(root):
    if root:
        trivialnode(root.left)
        trivialnode(root.right)
        print(root.val)


def iternode(root):
    stack = []
    pre = None
    if root:
       stack.append(root)
       while stack:
           curr = stack[len(stack) - 1]
           if (curr.left == None and curr.right == None) or (pre and (pre == curr.left or pre == curr.right)):
               print(curr.val)
               stack.pop()
               pre = curr
           else:
               if curr.right: 
                   stack.append(curr.right)
               if curr.left: 
                   stack.append(curr.left)

if __name__=='__main__':
    t=treenode()
    L = [8,3,9,2,12,5,34,23,10]
    t.val = L[0]
    for x in L:
        node = treenode()
        node.val = x
        t = insertnode(t,node)
    print("递归法:")
    trivialnode(t)
    print("迭代法:")
    iternode(t)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值