zoukankan      html  css  js  c++  java
  • 按之字形顺序打印二叉树

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

    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;
        }
  • 相关阅读:
    ajax chrome load
    不一样的自拍
    jQuery点击空白关闭弹出层
    笔记整理
    带三角缺口的边框
    连续input在同一行对齐问题
    用Windows PowerShell 控制管理 Microsoft Office 365
    Qt and C++ Reflection,利用Qt简化C++的反射实现
    滴滴打车推出的“专车服务”后的见闻以及思考
    Exchange的AutoDiscover服务
  • 原文地址:https://www.cnblogs.com/wft1990/p/7455315.html
Copyright © 2011-2022 走看看