zoukankan      html  css  js  c++  java
  • 【LeetCode-树】从上到下打印二叉树 III

    题目描述

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

    给定二叉树: [3,9,20,null,null,15,7],
        3
       / 
      9  20
        /  
       15   7
    
    返回其层次遍历结果:
    [
      [3],
      [20,9],
      [15,7]
    ]
    

    题目链接: https://leetcode-cn.com/problems/cong-shang-dao-xia-da-yin-er-cha-shu-iii-lcof/

    思路

    本题就是《剑指Offer》上的之字形打印二叉树。方法如下:
    记录当前是第几层:

    • 奇数层:节点前取后放,先放左子节点,再放右子节点(常规的 BFS 方式);
    • 偶数层:节点后取前放,先放右子节点,再放左子节点(与奇数层相反);

    由于使用到了队列的前取后放和后取前放,所以不能使用 STL 常规的 queue,可以使用双端队列 deque,双端队列的操作如下:

    • q.front():获取队头元素;
    • q.pop_front():删除队头元素;
    • q.back():获取队尾元素;
    • q.pop_back():删除队尾元素;

    代码如下:

    /**
     * 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:
        vector<vector<int>> levelOrder(TreeNode* root) {
            if(root==nullptr) return {};
    
            vector<vector<int>> ans;
            deque<TreeNode*> q;
            q.push_back(root);
            int curLevel = 1;
            while(!q.empty()){
                vector<int> v;
                int n = q.size();
                for(int i=0; i<n; i++){
                    if(curLevel%2!=0){
                        TreeNode* node = q.front(); q.pop_front();
                        v.push_back(node->val);
                        if(node->left) q.push_back(node->left);
                        if(node->right) q.push_back(node->right);
                    }else{
                        TreeNode* node = q.back(); q.pop_back();
                        v.push_back(node->val);
                        if(node->right) q.push_front(node->right);
                        if(node->left) q.push_front(node->left);
                    }
                }
                ans.push_back(v);
                curLevel++;
            }
            return ans;
        }
    };
    
    • 时间复杂度:O(n)
    • 空间复杂度:O(n)
  • 相关阅读:
    Kotlin函数之fun?function?
    Kotlin什么是top-level?
    Kotlin基础类型
    Hello,Kotlin!
    delphi 窗体自适应屏幕分辨率
    关于 Delphi 中流的使用(7) 压缩与解压缩(TCompressionStream、TDecompressionStream)
    delphi视频聊天
    两个DataGridEHToExcel
    用Delphi实现网络视频编程
    delphi Base64编码/解码及数据压缩/解压知识
  • 原文地址:https://www.cnblogs.com/flix/p/13229109.html
Copyright © 2011-2022 走看看