zoukankan      html  css  js  c++  java
  • [leetcode]Binary Tree Postorder Traversal @ Python

    原题地址:http://oj.leetcode.com/problems/binary-tree-postorder-traversal/

    题意:实现后序遍历。递归实现比较简单,非递归实现。

    解题思路:这道题的迭代求解比先序遍历和后序遍历要麻烦一些。假设一棵树是这样的:

                            1

                           /  

                          2    3

                              / 

                              4  5

         使用一个栈。分几个步骤:

         一,将根节点入栈,并将根节点的孩子入栈,入栈顺序为:先入右孩子,再入左孩子,顺序不能错。因为这样在弹栈时的顺序就是后序遍历的顺序了。如果左孩子还有左孩子或者右孩子,那么继续按先右后左的顺序入栈。那么上面这棵树开始的入栈顺序是:1,3,2。由于2不存在左右孩子,停止入栈。

           二,由于2没有左右孩子,遍历2并将2弹出,同时使用prev记录下2这个节点。

           三,2出栈后,栈为{1,3},此时3在栈顶,由于3存在左右孩子,按顺序入栈,此时栈为{1,3,5,4}。

           四,将4和5遍历并出栈,此时prev指向5,栈为{1,3}。prev的作用是什么呢?用来判断prev是否为栈顶元素的孩子,如果是,则说明子树的孩子已经遍历完成,需要遍历树根了。以上树为例:4和5出栈后,prev指向5,而5是栈顶元素3的孩子,说明孩子已经遍历完毕,则遍历3然后弹出3即可,即完成了子树{3,4,5}的后序遍历。

           五,此时栈为{1},为树根,而左右子树都遍历完了,最后遍历树根并弹出即可。

    代码:

    # Definition for a  binary tree node
    # class TreeNode:
    #     def __init__(self, x):
    #         self.val = x
    #         self.left = None
    #         self.right = None
    
    class Solution:
        # @param root, a tree node
        # @return a list of integers
        def recursive_postorder(self, root, list):
            if root:
                self.postorder( root.left, list )
                self.postorder( root.right, list )
                list.append(root.val)
        
        def iterative_postorder(self, root, list):
            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)):
                        list.append(curr.val)
                        stack.pop()
                        pre = curr
                    else:
                        if curr.right: stack.append(curr.right)
                        if curr.left: stack.append(curr.left)
            return list
    
        def postorderTraversal(self, root):
            list = []
            self.iterative_postorder(root,list)
            return list
            
  • 相关阅读:
    微软面试题_中文字符串转换为数字
    微软面试题_3个字母的组合
    LeetCode Notes_#1031_两个非重叠子数组的最大和
    剑指Offer_#57-II_和为 s 的连续正数序列
    LeetCode Notes_#560 和为k的子数组
    LeetCode Notes_#84 柱状图中最大的矩形
    LeetCode Notes_#221 最大正方形
    LeetCode Notes_#146 LRU缓存机制
    码云团队开发项目拉取与推送
    vue父子组件的双向绑定
  • 原文地址:https://www.cnblogs.com/zuoyuan/p/3720846.html
Copyright © 2011-2022 走看看