LeetCode OJ:Binary Tree Postorder Traversal

来源:互联网 发布:淘宝国际转运怎么开通 编辑:程序博客网 时间:2024/04/30 02:32

Binary Tree Postorder Traversal

 Total Accepted: 6036 Total Submissions: 20134My Submissions

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?

算法思想:

利用栈来储存走过的各点,到叶子节点时返回,图中还需记录哪些节点是已经访问过的

/** * 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> save;vector<TreeNode *> dot;if(root==NULL)return save;stack<TreeNode *> s;s.push(root);dot.push_back(root);while(!s.empty()){TreeNode *p=s.top();if((p->left==NULL||isExist(dot,p->left))&&(p->right==NULL||isExist(dot,p->right))){save.push_back(p->val);dot.push_back(p);s.pop();continue;}if(p->left==NULL||isExist(dot,p->left)){s.push(p->right);continue;}s.push(p->left);}return save;}bool isExist(vector<TreeNode *> dot,TreeNode *t){for(int i=0;i<dot.size();i++){if(dot[i]==t)return true;}return false;}};

另一种栈实现

/** * 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> result;        TreeNode *p,*q;        stack<TreeNode *> stk;                p=root;        do{            while(p){                stk.push(p);                p=p->left;            }            q=NULL;            while(!stk.empty()){                p=stk.top();                stk.pop();                if(p->right==q){                    result.push_back(p->val);                    q=p;                }else{                    stk.push(p);                    p=p->right;                    break;                }            }        }while(!stk.empty());                return result;    }};


Morris后序遍历

/** * 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> result;        TreeNode dummy(-1);        TreeNode *cur,*prev=NULL;        function<void(const TreeNode*)> visit=        [&result](const TreeNode *node){            result.push_back(node->val);        };                dummy.left=root;        cur=&dummy;        while(cur){            if(cur->left==NULL){                prev=cur;                cur=cur->right;            }else{                TreeNode *left=cur->left;                while(left->right&&left->right!=cur)                    left=left->right;                                if(left->right==NULL){                    left->right=cur;                    prev=cur;                    cur=cur->left;                }else {                    visit_reverse(cur->left,prev,visit);                    prev->right=NULL;                    prev=cur;                    cur=cur->right;                }            }        }                return result;    }private:    static void reverse(TreeNode *from,TreeNode *to){        TreeNode *x= from,*y = from->right,*z;        if(from ==  to)return;        while(x!=to){            z=y->right;            y->right=x;            x=y;            y=z;        }    }    static void visit_reverse(TreeNode *from,TreeNode *to,                                function<void(const TreeNode*)>& visit){        TreeNode *p=to;        reverse(from,to);        while(true){            visit(p);            if(p==from)break;                        p=p->right;        }        reverse(to,from);    }};



0 0