zoukankan      html  css  js  c++  java
  • 剑指offer从上往下打印二叉树 、leetcode102. Binary Tree Level Order Traversal(即剑指把二叉树打印成多行、层序打印)、107. Binary Tree Level Order Traversal II 、103. Binary Tree Zigzag Level Order Traversal(剑指之字型打印)

    从上往下打印二叉树这个是不分行的,用一个队列就可以实现

    class Solution {
    public:
        vector<int> PrintFromTopToBottom(TreeNode* root) {
            vector<int> result;
            queue<TreeNode* > container;
            if(root == NULL)
                return result;
            container.push(root);
            while(container.size() != 0){
                TreeNode* rot = container.front();
                container.pop();
                if(rot->left != NULL)
                    container.push(rot->left);
                if(rot->right != NULL)
                    container.push(rot->right);
                result.push_back(rot->val);
            }
            return result;
        }
    };

    leetcode102题是分行打印的,相对于直接从上往下打印,需要把每行表示出来。同样利用队列,但是需增加两个变量来统计分行的信息。

    注意一个细节:if(node->left != NULL)  与 if(!node->left) 不一样,即if(!node->left)中感叹号!的优先级高于->left

    class Solution {
    public:
        vector<vector<int>> levelOrder(TreeNode* root) {
            vector<vector<int>> result;
            if(!root)
                return result;
            vector<int> res;
            queue<TreeNode*> container;
            container.push(root);
            int now = 1;
            int next = 0;
            while(!container.empty()){
                TreeNode* node = container.front();
                container.pop();
                res.push_back(node->val);
                now--;
                if(node->left != NULL){
                    container.push(node->left);
                    next++;
                }
                if(node->right != NULL){
                    container.push(node->right);
                    next++;
                }
                if(now == 0){
                    now = next;
                    next = 0;
                    result.push_back(res);
                    res.clear();
                }
            }
            return result;
        }
    };

     打印多行的另一种写法,个人觉得这种写法比较简洁,少两个变量

    class Solution {
    public:
        vector<vector<int>> levelOrder(TreeNode* root) {
            vector<vector<int>> result;
            if(root == NULL)
                return result;
            queue<TreeNode*> q;
            q.push(root);
            while(!q.empty()){
                vector<int> res;
                for(int i = q.size();i > 0;i--){
                    TreeNode* node = q.front();
                    q.pop();
                    res.push_back(node->val);
                    if(node->left)
                        q.push(node->left);
                    if(node->right)
                        q.push(node->right);
                }
                result.push_back(res);
            }
            return result;
        }
    };

    leetcode107与102差不多,都是按行打印,但是107是从底层打印到高层。实际代码中,依旧是正常打印,只是在最后输出时用insert进行逆序就好了

    class Solution {
    public:
        vector<vector<int>> levelOrderBottom(TreeNode* root) {
            vector<vector<int>> result;
            if(root == NULL)
                return result;
            queue<TreeNode*> q;
            q.push(root);
            while(!q.empty()){
                vector<int> res;
                for(int i = q.size();i > 0;i--){
                    TreeNode* node = q.front();
                    res.push_back(node->val);
                    q.pop();
                    if(node->left)
                        q.push(node->left);
                    if(node->right)
                        q.push(node->right);
                }
                result.insert(result.begin(),res);
            }
            return result;
        }
    };

    在102和107中,自己都写了一种错误写法,比如102的错误写法如下:

    class Solution {
    public:
        vector<vector<int>> levelOrderBottom(TreeNode* root) {
            vector<vector<int>> result;
            if(root == NULL)
                return result;
            queue<TreeNode*> q;
            q.push(root);
            while(!q.empty()){
                vector<int> res;
                for(int i = 0;i < q.size();i++){
                    TreeNode* node = q.front();
                    res.push_back(node->val);
                    q.pop();
                    if(node->left)
                        q.push(node->left);
                    if(node->right)
                        q.push(node->right);
                }
                result.insert(result.begin(),res);
            }
            return result;
        }
    };

    错误如下:

    输入是:[3,9,20,null,null,15,7]

    正确输出是:[[3],[9,20],[15,7]]

    实际的错误输出是:[[3,9],[20,15],[7]]

    主要错误是在for循环当中,for循环的截止条件是<q.size(),这个q的size在每次循环中是变化的,但是实际上我只想要初始的size,这个size表达的是同一层有多少个的节点

    注意:for循环中,初始化是只是第一次计算,但是循环判断条件,每次循环都要重新计算

    这也是bug的原因所在

    103. Binary Tree Zigzag Level Order Traversal(剑指offer之字型打印)

    注意:第一行先放左后放右,第二行是先放右后放左。用两个堆进行实现。

    class Solution {
    public:
        vector<vector<int>> zigzagLevelOrder(TreeNode* root) {
            vector<vector<int>> result;
            vector<int> res;
            if(root == NULL)
                return result;
            stack<TreeNode*> sta1;
            stack<TreeNode*> sta2;
            sta1.push(root);
            int next = 0;
            while(!sta1.empty() || !sta2.empty()){
                if(next % 2 == 0){
                    TreeNode* node = sta1.top();
                    res.push_back(node->val);
                    sta1.pop();
                    if(node->left)
                        sta2.push(node->left);
                    if(node->right)
                        sta2.push(node->right);
                    if(sta1.empty()){
                        next++;
                        result.push_back(res);
                        res.clear();
                    }
                }
                else{
                    TreeNode* node = sta2.top();
                    res.push_back(node->val);
                    sta2.pop();
                    if(node->right)
                        sta1.push(node->right);
                    if(node->left)
                        sta1.push(node->left);
                    if(sta2.empty()){
                        next++;
                        result.push_back(res);
                        res.clear();
                    }
                }           
            }
            return result;
        }
    };
  • 相关阅读:
    c# 类型转换符的重载
    C# 串口读写
    STM32 Keil C++编写单片机程序
    C# 静态构造函数的使用
    MvvMlight 学习之 SimpleIoc
    STM32 之 DMA
    STM32 之 SysTick
    突然发现用PHP做多条件模糊查询很简单
    discuz代码转为html代码
    Discuz!开发之HTML转Discuz代码(bbcode)函数html2bbcode()
  • 原文地址:https://www.cnblogs.com/ymjyqsx/p/10498632.html
Copyright © 2011-2022 走看看