LeetCode_Binary Tree Postorder Traversal

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?

简单的题目,只要清除二叉树的三种遍历方法就行了,这个我前面说过。

本题重要的一点就是选对数据结构,对于,二叉树的后续遍历(左-右-根),选用栈作为基础数据结构,需要注意的是,根节点需要先后两次进栈,

第一次:遍历左子树

第二次:遍历右子树

最后出栈输出自身,为此设一个标志位Flag:

Flag=0,刚刚发现根节点,压栈遍历左子树

Flag=1,左子树遍历完成,压栈遍历右子树

Flag-2,右子树遍历完成,输出自身。

代码如下:

struct stackElement {
     TreeNode* pnode;//具体的节点
     int color;//当前的遍历状态0:第一次遍历,1:第二次遍历,2:第三次遍历
     stackElement(TreeNode *p,int c)
     {
         pnode=p;
         color=c;
     }
     stackElement(const stackElement &ele)
     {
         pnode=ele.pnode;
         color=ele.color;
     }
     stackElement operator=(const stackElement &ele)
     {
           stackElement element(ele);
           return element;
     }
};
class Solution {
public:
    vector<int> postorderTraversal(TreeNode *root) {
        vector <int> postOrder;
        if (root==NULL)
        {
            return postOrder;
        }
        
        stack <stackElement> postTraversalStack;
        TreeNode* pcurrent=root;
         postTraversalStack.push(stackElement(pcurrent,0));
        while (!postTraversalStack.empty())
        {
            stackElement currElement=postTraversalStack.top();
            postTraversalStack.pop();

            //遍历左儿子
            if (currElement.color==0)
            {
                currElement.color=1;//change color
                postTraversalStack.push(currElement);

                pcurrent=currElement.pnode->left;
                if (pcurrent!=NULL)
                {
                    postTraversalStack.push(stackElement(pcurrent,0));
                }
            }
            else
            {
                //遍历右儿子
                if (currElement.color==1)
                {
                    currElement.color=2;//change color
                    postTraversalStack.push(currElement);

                    pcurrent=currElement.pnode->right;
                    if (pcurrent!=NULL)
                    {
                        postTraversalStack.push(stackElement(pcurrent,0));
                    }
                }
                else
                {
                    //输出自己
                    postOrder.push_back(currElement.pnode->val);
                }
            }
        }
        return postOrder;
    }
};



你可能感兴趣的:(LeetCode)