(C++)使用非递归方法解决(递归方法代码上面也有,但没有调用)

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

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

/**
 * struct TreeNode {
 *    int val;
 *    struct TreeNode *left;
 *    struct TreeNode *right;
 * };
 */

class Solution {
public:

    /**
     * 
     * @param root TreeNode类 the root of binary tree
     * @return int整型vector<vector<>>
     */

    // 定义三个一维数组
    vector<int> pre;
    vector<int> in;
    vector<int> pos;



    // 递归函数一
    void preorder(TreeNode* root)
    {
        if(root != nullptr)
        {
            pre.push_back(root->val);
            preorder(root->left);
            preorder(root->right);
        }
    }

    // 递归函数二
    void inorder(TreeNode* root)
    {
        if (root != nullptr)
        {
            inorder(root->left);
            in.push_back(root->val);
            inorder(root->right);
        }
    }

    // 递归函数三
    void posorder(TreeNode* root)
    {
        if (root != nullptr)
        {
            posorder(root->left);
            posorder(root->right);
            pos.push_back(root->val);
        }
    }



    // 迭代函数一(使用了一个栈)
    void preorder2(TreeNode* root)
    {
        if (root != nullptr)
        {
            stack<TreeNode*> stk1;
            stk1.push(root);

            while(!stk1.empty())
            {
                root = stk1.top(); // 用root方便进行表示
                pre.push_back(root->val);
                stk1.pop();

                if (root->right != nullptr)
                    stk1.push(root->right);
                if (root->left != nullptr)
                    stk1.push(root->left);
            }
        }
    }

    // 迭代函数二(使用了一个栈)
    void inorder2(TreeNode* root)
    {
        if (root != nullptr)
        {
            stack<TreeNode*> stk1;

            while(!stk1.empty() || root != nullptr)
            {
                if (root != nullptr)
                {
                    stk1.push(root);
                    root = root->left;
                }
                else
                {
                    root = stk1.top();
                    in.push_back(root->val);
                    stk1.pop();
                    root = root->right;
                }
            }
        }
    }


    // 迭代函数三(使用了两个栈)
    void posorder2(TreeNode* root)
    {
        if (root != nullptr)
        {
            stack<TreeNode*> stk1;
            stack<TreeNode*> stk2; // 第二个栈起到了反序的作用
            stk1.push(root);

            while(!stk1.empty())
            {
                root = stk1.top();
                stk2.push(root);
                stk1.pop();

                if (root->left != nullptr)
                    stk1.push(root->left);
                if (root->right != nullptr)
                    stk1.push(root->right);
            }
            while(!stk2.empty())
            {
                pos.push_back(stk2.top()->val);
                stk2.pop();
            }
        }
    }



    vector<vector<int> > threeOrders(TreeNode* root) {
        // write code here

        // 二维数组的操作
        vector<vector<int>> res;

        preorder2(root);
        res.push_back(pre);

        inorder2(root);
        res.push_back(in);

        posorder2(root);
        res.push_back(pos);

        return res;

    }
};
全部评论
左神的算法课上面的
点赞 回复 分享
发布于 2021-04-07 22:42

相关推荐

学java时间比较短不到三个月,基本的技术栈都过了一遍就是都不太深,有个小项目。是继续找实习还是沉淀准备秋招呢?找实习的话会花很多时间在八股,放弃的话又怕秋招简历太难看。有无大佬支招
今天java了吗:1.一定要找实习,实习不一定要去,但是找实习过程中的面试经验和心态经验才是最重要的 2.八股本来就是大头,甚至比项目重要 3.这个时间段也是面试比较多的阶段,可以抓住机会锻炼。面试才会发现自己的不足,感觉自己会了和能给面试官娓娓道来是两码事
点赞 评论 收藏
分享
舂锋:不能投什么岗都用一份简历,一般都是要看企业的岗位需求来写职业技能或者是项目经历,跟岗位相关的就写多一点。
点赞 评论 收藏
分享
评论
6
4
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务