LeetCode OJ: Binary Tree Postorder Traversal

来源:互联网 发布:数据库系统全书第二版 编辑:程序博客网 时间:2024/04/29 09:54

转战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?

分析:看到类方法的返回值是vector<int>,就知道不能用递归了,循环后续遍历二叉树也是当年考研的经典题目了,下面的代码中使用了两个数组栈,操作起来也蛮方便的
/** * 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>* v_ptr = new vector<int>;        vector<int> vec;        if (root == NULL) return vec;        else{            const int MAXSIZE = 10000;            TreeNode* stack[MAXSIZE];            int mark[MAXSIZE];            int cnt = 0;            stack[cnt] = root;            mark[cnt] = 0; //当前节点的左右孩子均为未访问            ++cnt;            while (cnt != 0){                switch (mark[cnt-1]){                    case 0: //若从未被取出过,则访问左孩子                        ++(mark[cnt-1]); //标记为取出过一次                        if(stack[cnt-1]->left != NULL){                            stack[cnt] = stack[cnt-1]->left;                            mark[cnt] = 0;                            ++cnt;                        }                        break;                    case 1: //若被取出过一次,则访问右孩子                        ++(mark[cnt-1]); //标记为取出过两次                        if(stack[cnt-1]->right != NULL){                            stack[cnt] = stack[cnt-1]->right;                            mark[cnt] = 0;                            ++cnt;                        }                        break;                    case 2: //若被取出过两次,则访问当前结点,并出栈                        vec.push_back(stack[cnt-1]->val);                        --cnt;                        break;                }            }            return vec;        }    }};

0 0