LeetCode OJ 之 Binary Tree Postorder Traversal (二叉树的后序遍历)

来源:互联网 发布:ubuntu安装优麒麟市场 编辑:程序博客网 时间:2024/06/06 02:16

题目:

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> result;        if(root == NULL)            return result;        postorderTraversal(root,result);        return result;    }    void postorderTraversal(TreeNode *root , vector<int> &result)    {        if(root == NULL)            return ;        postorderTraversal(root->left,result);        postorderTraversal(root->right,result);        result.push_back(root->val);    }};

非递归版代码1:

思路:前序遍历的顺序是:root-left-right,用栈实现就是 root入栈,root出栈,输出root ,right入栈,left入栈(),前序遍历详情参看:http://blog.csdn.net/u012243115/article/details/42000877 其中的非递归版本代码2。

后序遍历的顺序是:left-right-root. ,可以先遍历 root-right-left  ,然后再对结果reverse一下,即是后序遍历的结果。

对于root-right-left 的遍历方法类似前序遍历。用栈实现就是 root入栈,root出栈,输出root,left入栈,right入栈。

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

非递归版代码2:

详情请参看:http://blog.csdn.net/u012243115/article/details/40615603

/** * 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;        if(root == NULL)            return result;        TreeNode *p = root;        stack<pair<TreeNode *,bool> > stk;        while(p != NULL || !stk.empty())        {            if(p)            {                stk.push(make_pair(p , false));                p = p->left;            }            else                if(stk.top().second == false)                {                    stk.top().second = true;                    p = stk.top().first->right;                }                else                {                    result.push_back(stk.top().first->val);                    stk.pop();                }        }                return result;    }};

非递归版代码3:


/** * 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;        stack<TreeNode *> s;        TreeNode *p = root , *pre = NULL;        while(p || !s.empty())        {            if(p)            {                s.push(p);                p = p->left;    //走到最左边            }            else            {                p = s.top();    //取得栈顶                                //如果右孩子非空,且右孩子未遍历过,则遍历右字树                if(p->right && p->right != pre)                {                    p = p->right;                    s.push(p);                    p = p->left;                }                //如果右孩子为空,或者p->right == pre即上次遍历的结点pre为右孩子才遍历当前结点(即右孩子遍历过才遍历根结点)                else                {                    s.pop();                    result.push_back(p->val);                    pre = p;                    p = NULL;   //这一步很重要                }            }        }        return result;    }};


0 0
原创粉丝点击