• 按之字形顺序打印二叉树


    请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。

    struct TreeNode {
        int val;
        struct TreeNode *left;
        struct TreeNode *right;
        TreeNode(int x) :
                val(x), left(NULL), right(NULL) {
        }
    };

    思路一:使用队列类似于BFS,但是这里需要加控制转向

    vector<vector<int> > Print(TreeNode* pRoot) {
            vector<vector<int> > res;
            if(pRoot==NULL) return res;
            queue<TreeNode*> qu;//定义一个队列
            qu.push(pRoot);
            bool even=false;
            while(!qu.empty())
            {
                vector<int> vec;
                int size=qu.size();
                for(int i=0;i<size;i++)
                {
                    TreeNode *tmp=qu.front();
                    qu.pop();
                    vec.push_back(tmp->val);//把该节点的值放入栈中
                    if(tmp->left!=NULL)
                    {
                        qu.push(tmp->left);
                    }
                    if(tmp->right!=NULL)
                        qu.push(tmp->right);
                }
                if(even)
                 {
                    reverse(vec.begin(),vec.end());//使用reverse效率比较低
                }
                res.push_back(vec);
                even=!even;
            }
            
            return res;
        }

    思路二:使用两个栈:stack1储存奇数层,stack2储存偶数层,交替放入。

    vector<vector<int> > Print(TreeNode* pRoot) {
            vector<vector<int> > result;
            stack<TreeNode *> stack1,stack2;
        
            if(pRoot!=NULL)
                stack1.push(pRoot);
            struct TreeNode *node;
            while(!stack1.empty() || !stack2.empty()){
                vector<int> data;
                if(!stack1.empty()){
                    while(!stack1.empty()){
                        node = stack1.top();
                        stack1.pop();
                        data.push_back(node->val);
                        if(node->left!=NULL)
                            stack2.push(node->left);
                        if(node->right!=NULL)
                            stack2.push(node->right);
                    }
                    result.push_back(data);
                }
                else if(!stack2.empty()){
                    while(!stack2.empty()){
                        node = stack2.top();
                        stack2.pop();
                        data.push_back(node->val);
                        if(node->right!=NULL)
                            stack1.push(node->right);
                        if(node->left!=NULL)
                            stack1.push(node->left);
                    }
                    result.push_back(data);
                }
            }
            return result;
        }
  • 相关阅读:
    如何为新的应用获取更高的关键字排名
    AppStore审核不通过?看看问题出在哪儿
    django 学习-11 Django模型数据模板呈现
    django 学习-10 Django多对多关系模型
    Django学习--9 Admin
    Django学习--9 多对一关系模型
    django 学习-7 模型数据操作
    django 学习-6 定义模型--数据库的使用
    django 学习-5 模板使用流程
    django 学习-4 模板标签
  • 原文地址:https://www.cnblogs.com/wft1990/p/7455315.html
Copyright © 2020-2023  润新知