码迷,mamicode.com
首页 > 其他好文 > 详细

【LeetCode】Binary Tree Postorder Traversal

时间:2015-05-03 20:42:49      阅读:96      评论:0      收藏:0      [点我收藏+]

标签:二叉树   leetcode   

      题意:

Given a binary tree, return the postorder traversal of its 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?

     思路:

     非递归地遍历二叉树。坑爹...一开始用 if(!cur->left) 的形式来测试空指针...结果一直 runtime error....原来空指针的 bool  值不为 false 啊....

     二叉树的前序和中序的非递归遍历比较好做,后序比较难想。不过思路还是用 stack 来解决的。我们需要思考一个问题,什么时候才可以访问一个元素(即遍历时处理到它)?

    我们考虑对一个栈顶元素 cur ,如果:

  • cur 的左右子树都是空的,那么可以对它进行出栈访问。
  • 如果上个出栈的元素(被处理的元素)是 cur 的右子树,那么 cur 可以出栈访问,因为它的左右子树都被处理完了。
  • 如果上个出栈的元素是 cur 的左子树,那么 cur 可以出栈访问,因为这意味着 cur 没有右子树而且左子树被处理完了。


    代码:

    C++:

/**
 * Definition for binary tree
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    vector<int> postorderTraversal(TreeNode *root) {
        vector<int> ans;
        stack<TreeNode*> node;

        if(root == NULL) return ans;

        node.push(root);
        TreeNode* last = root;
        while(!node.empty())
        {
            TreeNode* cur = node.top();
            if(last == cur->right || last == cur->left || ((cur->right == NULL) && ( cur->left == NULL)))
            {
                ans.push_back(cur->val);
                node.pop();
                last = cur;
            } else {
                if(cur->right != NULL) node.push(cur->right);
                if(cur->left != NULL) node.push(cur->left);
            }
        }
        return ans;
    }
};

     Python:

# 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 postorderTraversal(self, root):
        ans = []
        stack = []

        if root == None:
            return ans

        stack.append(root)
        last = root
        while len(stack):
            cur = stack[len(stack)-1]
            if last == cur.left or last == cur.right or (cur.left == None and cur.right == None):
                ans.append(stack.pop().val)
                last = cur
            else:
                if cur.right != None:
                    stack.append(cur.right)
                if cur.left != None:
                    stack.append(cur.left)
        return ans

【LeetCode】Binary Tree Postorder Traversal

标签:二叉树   leetcode   

原文地址:http://blog.csdn.net/jcjc918/article/details/44489363

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!