递归+迭代(借用栈)

实现二叉树先序,中序和后序遍历

http://www.nowcoder.com/questionTerminal/a9fec6c46a684ad5a3abd4e365a9d362

/**
 * struct TreeNode {
 *    int val;
 *    struct TreeNode *left;
 *    struct TreeNode *right;
 * };
 */
//递归版本大家基本都会
//但是我觉得迭代版本的写法就很灵活,特别是中序和后序遍历
//巧妙借用stack容器的特性,大家可以多关注下迭代版本

class Solution {
private:
    vector<int> preOrder,inOrder,postOrder;
public:
    vector<vector<int> > threeOrders(TreeNode* root) {
        vector<vector<int>> ans;
        if(!root) return ans;

        PreOrderIteratively(root);
        InOrderIteratively(root);
        PostOrderIteratively(root);

        ans.push_back(preOrder);
        ans.push_back(inOrder);
        ans.push_back(postOrder);

        return ans;
    }
   void PreOrder(TreeNode* root){
        if(!root) return ;
        preOrder.push_back(root->val);
        PreOrder(root->left);
        PreOrder(root->right);

    }
    void InOrder(TreeNode* root){
        if(!root) return;

        InOrder(root->left);
        inOrder.push_back(root->val);
        InOrder(root->right);

    }
    void PostOrder(TreeNode* root){

        if(!root) return ;

        PostOrder(root->left);
        PostOrder(root->right);
        postOrder.push_back(root->val);

    }

    void PreOrderIteratively(TreeNode* root){
        if(root==nullptr)
            return;

        stack<TreeNode*> stk;
        stk.push(root);
        TreeNode* p=nullptr;
        while(!stk.empty()){
            p=stk.top();
            stk.pop();
            preOrder.push_back(p->val);
            if(p->right)
                stk.push(p->right);
            if(p->left)
                stk.push(p->left);
        }
    }
    void InOrderIteratively(TreeNode* root){
        if(!root)
            return;

        stack<TreeNode*> stk;
        TreeNode* p=root;
        while(p || !stk.empty()){
            if(p){
                stk.push(p);
                p=p->left;
            }
            else{
                p=stk.top();
                stk.pop();
                inOrder.push_back(p->val);
                p=p->right;
            }

        }



    }
    void PostOrderIteratively(TreeNode* root){
        if(!root)
            return;

        stack<TreeNode*> stk;
        stk.push(root);
        TreeNode* p=nullptr;
        while(!stk.empty()){
            p=stk.top();
            stk.pop();
            postOrder.insert(postOrder.begin(), p->val);

            if(p->left)
                stk.push(p->left);

            if(p->right)
                stk.push(p->right);
        }
    }


};
全部评论

相关推荐

虚闻松声:简历看起来很清爽。几点建议。 1. 总结提炼项目工作内容。如第一个项目第一点,研发用户信息管理、购票功能:(然后具体展开)。还可以继续总结,如基础功能开发、算法优化座位分配、并发性能提升等等 2. 优化技术栈描述。全文多次出现Spring Boot,我感觉一次就够了。可以不写或者写整个体技术架构? 3. 增加业务指标描述。最好有一些业务效果的指标。或者优化的效果指标等等。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务