• 从上到下打印二叉树,按行打印(Python and C++解法)


    题目:

    从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行。

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

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

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

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/cong-shang-dao-xia-da-yin-er-cha-shu-ii-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         toBePrint = 1  # 本层将要打印的元素数量
    14 
    15         while root is not None and len(queue) != 0:
    16             nextLvevelNum = 0  # 下一层将要打印的数量
    17             childRes = []  # 存储子结果
    18             while toBePrint:  # 当前层没有打印完
    19                 temp = queue.pop(0)  # 取队的头元素
    20                 toBePrint -= 1
    21                 childRes.append(temp.val)
    22 
    23                 if temp.left:
    24                     queue.append(temp.left)
    25                     nextLvevelNum += 1
    26                 if temp.right:
    27                     queue.append(temp.right)
    28                     nextLvevelNum += 1
    29 
    30             toBePrint = nextLvevelNum  # 下一层要打印的数量就是下一轮当前层要打印的数量
    31             res.append(childRes)
    32         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         int toBePrint = 1;  // 当前层将要打印的节点数量
    15         while (root != NULL && !doubleQue.empty()) {  // 当根节点非空且队列非空时
    16             vector<int> childRes;
    17             int nextLevelNum = 0;  // 下一层将要打印的节点数量
    18             while (toBePrint != 0) {
    19                 TreeNode *tempNode = doubleQue.at(0); // 取队头元素
    20                 doubleQue.pop_front();  // 删除队头元素
    21                 toBePrint -= 1;
    22                 childRes.push_back(tempNode->val);
    23 
    24                 if (tempNode->left) {
    25                     doubleQue.push_back(tempNode->left);
    26                     nextLevelNum += 1;
    27                 }
    28                 if (tempNode->right) {
    29                     doubleQue.push_back(tempNode->right);
    30                     nextLevelNum += 1;
    31                 }
    32             }
    33             toBePrint = nextLevelNum;
    34             res.push_back(childRes);
    35         }
    36         return res;
    37     }
    38 };
  • 相关阅读:
    mycat 1.6.6.1 distinct报错问题
    linux下Tomcat+OpenSSL配置单向&双向认证(自制证书)
    Too many open files错误与解决方法
    Tomcat类加载机制触发的Too many open files问题分析(转)
    spring boot 自签发https证书
    redis集群如何解决重启不了的问题
    centos7 docker 安装 zookeeper 3.4.13 集群
    centos7用docker安装kafka
    心怀感恩
    不使用if switch 各种大于 小于 判断2个数的大小
  • 原文地址:https://www.cnblogs.com/kongzimengzixiaozhuzi/p/13268970.html
Copyright © 2020-2023  润新知