145. Binary Tree Postorder Traversal

来源:互联网 发布:淘宝怎么参加双11活动 编辑:程序博客网 时间:2024/05/17 09:36

题目:Binary Tree Postorder Traversal

原题链接:https://leetcode.com/problems/binary-tree-postorder-traversal/
Given a binary tree, return the postorder traversal of its nodes’ values.

For example:
Given binary tree {1,#,2,3},
post
return [3,2,1].

Note: Recursive solution is trivial, could you do it iteratively?

给出一个二叉树,返回它的后序遍历元素顺序。
注意,不能用递归。
如上图,后序遍历结果为 [3,2,1]

不用递归的话需要用栈,根据栈后进先出的顺序,由于后序遍历的顺序是左子树,右子树,根节点,那么压入栈的顺序应该是根节点,右子树,左子树。
方法如下,把根节点入栈。
然后每次从栈中取出栈顶节点,判断当前节点是不是前一个输出节点的父节点,如果是的话,说明当前节点的子树已经都遍历完了,输出即可;如果不是,说明当前输出的节点和前一个输出的节点的分部应该是某个节点的右子树和左子树上,这个时候需要把当前节点的子树再按照右子树,左子树的顺序压入栈,直到叶子节点。然后取出叶子节点,遍历它。重复上述过程。

代码如下:

/** * Definition for a binary tree node. * 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> ret;        stack<TreeNode*>st;        if(root) st.push(root);        while(!st.empty()) {            if(st.top()->left!=root && st.top()->right!=root) {                while(auto x=st.top()) {                    if(x->right) st.push(x->right);                    if(x->left) st.push(x->left);                    if(!x->right && !x->left) break;                }            }            root=st.top();            ret.push_back(root->val);            st.pop();        }        return ret;    }};
0 0
原创粉丝点击