zoukankan      html  css  js  c++  java
  • 剑指 Offer 32

    题目

    剑指 Offer 32 - III. 从上到下打印二叉树 III

    我的思路

    我的思路是按照题目要求的顺序遍历并打印。因为后一层遍历的第一个节点可能是是前一层遍历的最后一个节点的孩子,所以使用两个栈,一个栈存储当前层,另一个栈存储下一层的节点。这样自然相邻两层之间的访问顺序是相反的(要注意奇数或者偶数层访问左右孩子的顺序也不同)。按照访问顺序向结果列表添加元素即可。

    我的实现

    /**
     * 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:
        deque<TreeNode*> *nowStack;
        deque<TreeNode*> *nextStack;
        void levelOrder(TreeNode *root,vector<vector<int>> &result){
            bool left2right = true;
            nextStack = new deque<TreeNode*>;
            if(root!=nullptr){
                nextStack->push_back(root);
            }
    
            while(!nextStack->empty()){
                vector<int> tempList;      
                nowStack = nextStack;
                nextStack = new deque<TreeNode*>;
                while(!nowStack->empty()){
                    TreeNode* temp = nowStack->back();
                    nowStack->pop_back();
                    tempList.push_back(temp->val);
                    if(left2right==true){
                        if(temp->left!=nullptr){
                            nextStack->push_back(temp->left);
    
                        }
                        if(temp->right!=nullptr){
                            nextStack->push_back(temp->right);
                        }
                    }else{
                        if(temp->right!=nullptr){
                            nextStack->push_back(temp->right);
                        }
                        if(temp->left!=nullptr){
                            nextStack->push_back(temp->left);
                        }
                    }
                }
                result.push_back(tempList);
                left2right = !left2right;
            }
        }
        vector<vector<int>> levelOrder(TreeNode* root) {
            vector<vector<int>> result;
            levelOrder(root,result);
            return result;
    
        }
    };
    /*
    用两个栈实现,一个栈存放当前遍历层次的节点,另一个栈存放下一个层次的节点*/

    拓展学习

    官方题解的几个思路与我稍稍不同:按照标准的层序遍历并访问各层的节点,再处理访问得到的列表。

    class Solution {
    public:
        vector<vector<int>> levelOrder(TreeNode* root) {
            vector<vector<int>> res;
            if (root==NULL)
                return res;
            bool flag = true; //从左向右打印为true,从右向左打印为false
            deque<TreeNode*> q;
            q.push_back(root);
            while (!q.empty())
            {
                int n = q.size();
                vector<int> out;
                TreeNode* node;
                while (n>0)
                {
                    if (flag) // 前取后放:从左向右打印,所以从前边取,后边放入
                    {
                        node = q.front();
                        q.pop_front();
                        if (node->left)
                            q.push_back(node->left);  // 下一层顺序存放至尾
                        if (node->right)
                            q.push_back(node->right);
                    }
                    else  //后取前放: 从右向左,从后边取,前边放入
                    {
                        node = q.back();
                        q.pop_back();
                        if (node->right)
                            q.push_front(node->right);  // 下一层逆序存放至首
                        if (node->left)
                            q.push_front(node->left);
                    }
                    out.push_back(node->val);
                    n--;
                }
                flag = !flag;
                res.push_back(out);
            }
            return res;
        }
    };
    
    作者:bryceustc
    链接:https://leetcode-cn.com/problems/cong-shang-dao-xia-da-yin-er-cha-shu-iii-lcof/solution/cli-yong-dequeshuang-duan-dui-lie-hao-shi-0ms-ji-b/
    来源:力扣(LeetCode)
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
  • 相关阅读:
    预设池(滑雪大冒险)
    随机
    python select模块详解
    轮询、长轮询、长连接、websocket
    Python中的栈溢出及解决办法
    JavaScript中的this的指代对象详解
    Django--缓存、信号、序列化
    SQLAlchemy中的自引用
    Python操作 RabbitMQ、Redis、Memcache、SQLAlchemy
    虚拟机下安装centos7方法,修改系统语言为简体中文的方法
  • 原文地址:https://www.cnblogs.com/BoysCryToo/p/13496105.html
Copyright © 2011-2022 走看看