zoukankan      html  css  js  c++  java
  • 之字形打印二叉树(Python and C++解法)

    题目:

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

    例如:
    给定二叉树: [3,9,20,null,null,15,7],

         3
        /
      9  20
         /   
       15   7
    返回其层次遍历结果:

    [
    [3],
    [20,9],
    [15,7]
    ]

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/cong-shang-dao-xia-da-yin-er-cha-shu-iii-lcof

    思路:

      由于奇偶层的打印顺序不一致,所以需要有奇偶标志位。

      使用双端队列。

      为了便于思考,需要画出树的例子,然后写出结果,看图按照顺序来进行入队、出队和打印输出。

    Python解法:

     1 class TreeNode:
     2     def __init__(self, x):
     3         self.val = x
     4         self.left = None
     5         self.right = None
     6 
     7 
     8 class Solution:
     9     def levelOrder(self, root: TreeNode) -> List[List[int]]:
    10         res = []  # 存储全部结果
    11         queue = []
    12         queue.append(root)
    13         falg = True  # 奇偶标志位,True为奇
    14 
    15         while root is not None and queue:
    16             lenQueue = len(queue)
    17             childRes = []  # 存储每一层层结果
    18 
    19             while lenQueue > 0:
    20                 if falg:  # 如果是奇数层
    21                     tempNode = queue.pop(0)  # 奇数层从左到右打印元素
    22                     if tempNode.left:  # 下一层,即偶数层从左到右添加到队列
    23                         queue.append(tempNode.left)
    24                     if tempNode.right:
    25                         queue.append(tempNode.right)
    26                 else:  # 如果是偶数层
    27                     tempNode = queue.pop()  # 偶数层从右到左打印元素
    28                     if tempNode.right:  # 下一层,即奇数层从右到左添加到队列
    29                         queue.insert(0, tempNode.right)  # 注意添加的顺序
    30                     if tempNode.left:
    31                         queue.insert(0, tempNode.left)
    32                 childRes.append(tempNode.val)
    33                 lenQueue -= 1
    34             res.append(childRes)
    35             falg = not falg  # 奇偶层变换
    36         return res

    C++解法:

     1 struct TreeNode {
     2     int val;
     3     TreeNode *left;
     4     TreeNode *right;
     5     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     6 };
     7 
     8 class Solution {
     9 public:
    10     vector<vector<int>> levelOrder(TreeNode* root) {
    11         vector<vector<int>> res;
    12         deque<TreeNode*> doubleQue;
    13         doubleQue.push_back(root);
    14         bool flag = true;  // 奇偶行标志位
    15 
    16         while (root != NULL && !doubleQue.empty()) {
    17             vector<int> childRes;
    18             int lenQueue = doubleQue.size();  // 计算每一层队列的长度(元素的数量)
    19             while (lenQueue) {
    20                 if (flag) {  // 如果是奇数层
    21                     TreeNode *tempNode = doubleQue.front();  // 奇数层从左向右打印元素
    22                     doubleQue.pop_front();  // 删除队列头部元素
    23                     childRes.push_back(tempNode->val);
    24                     if (tempNode->left)  // 偶数层从左到右添加到队列
    25                         doubleQue.push_back(tempNode->left);
    26                     if (tempNode->right)
    27                         doubleQue.push_back(tempNode->right);
    28                 }
    29                 else {  // 如果是偶数层
    30                     TreeNode *tempNode = doubleQue.back();  // 偶数层从右向左打印元素
    31                     doubleQue.pop_back();  // 删除队列尾部元素
    32                     childRes.push_back(tempNode->val);
    33                     if (tempNode->right)  // 奇数层从右向左添加到队列
    34                         doubleQue.push_front(tempNode->right);  // 添加到头部
    35                     if (tempNode->left)
    36                         doubleQue.push_front(tempNode->left);
    37                 }
    38                 lenQueue -= 1;
    39             }
    40             res.push_back(childRes);
    41             flag = !flag;
    42         }
    43         return res;
    44     }
    45 };
  • 相关阅读:
    作为Bootstrap中文站维护者-我们再次翻译BootstrapVue项目
    在vs2017和vs2019下发布应用之Windows程序打包-附图标修改和默认安装路径定义全教程
    Windows应用开发中程序窗口中的各种图标尺寸规划
    SVN设置忽略文件列表以及丢失了预定增加的文件解决方法
    基于VuePress构建高基于markdown语法的网站全教程
    国家高新技术企业门户与移动全生态开发套件-Zooma!逐浪CMS v8.1.4正式发布
    Json跨域登录问题的之Access-Control-Allow-Origin 站点跨域请求的问题
    IIS设置URL重写,实现页面的跳转的重定向方法
    163邮件:554 DT:SPM 163 smtp11,D8CowABHLj7jX_BdY+q6Ag--.21946S2 1576034275,please see http://mail.163.com/help/help_spam_16.htm?ip=117.22.255.130&hostid=smtp11&time=1576034275
    读《阿里巴巴Java开发手册 1.4.0》笔记
  • 原文地址:https://www.cnblogs.com/kongzimengzixiaozhuzi/p/13269750.html
Copyright © 2011-2022 走看看