LeetCode 145 Binary Tree Postorder Traversal

来源:互联网 发布:淘宝好看的女包店铺 编辑:程序博客网 时间:2024/06/04 18:28

题目









递归分析


如果用递归的方法则要解决这么两个问题:

1.如果 f(root)可以得到整个树的后序遍历,那么f(root-left)就能得到左子树的后序,那么也可以得到右子树的后序

左子树的后序  +  右子树的后序 + 根结点即可得到结果。

2. 不可能一直向下递归下去,终止条件:当遍历到叶结点是应该怎么处理。

当遍历叶节点的左子树或右子树时,为空。此时返回空数组即可。叶子结点向上返回  空 + 空 + 叶子结点值 = 叶子结点值



递归题解



/** * 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> value;        if(root == NULL)            return value;        vector<int> left = postorderTraversal(root->left);        vector<int> right = postorderTraversal(root->right);        for(int i=0;i<left.size();i++)            value.push_back(left[i]);        for(int i=0;i<right.size();i++)            value.push_back(right[i]);        value.push_back(root->val);        return value;    }};




非递归分析



后序遍历是 左 - 右 - 上 的遍历方式。

可以逆着这个方向从上到下进行,将遍历的到的元素也逆向加入数组即可。




非递归题解



/** * 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> value;        vector<TreeNode*> tree;        if(root == NULL)            return value;        tree.push_back(root);        while(!tree.empty()){            TreeNode *temp = tree.front();            tree.erase(tree.begin());            value.insert(value.begin(),temp->val);            if(temp->left != NULL)                tree.insert(tree.begin(),temp->left);            if(temp->right != NULL)                tree.insert(tree.begin(),temp->right);        }        return value;            }};

之所以用 insert将子结点插入在兄弟结点之前是因为反向遍历中,子节点的优先度更高。



0 0