剑指offer22:从上往下打印出二叉树的每个节点,同层节点从左至右打印。

1 题目描述

  从上往下打印出二叉树的每个节点,同层节点从左至右打印。

2 思路和方法

  使用一个队列存放节点。先将根节点加入到队列中,然后循环遍历队列中的元素,遍历过程中,访问该节点的左右子节点,再将左右子节点加入到队列中。

  例子:1 2 3 4 5 6 7 8

?

  对于第一层,只有根节点 1,第二层有节点2和3。先将根节点1加入到队列中,接下来要打印节点为1的两个子节点,应该在遍历到该根节点时把值为2和3的两个子节点保存到队列。按照从左向右打印的要求,取出2,保存其子节点4;随后取出3,保存其子节点“5”和“6”;随后取出4,保存子节点“7”;随后取出5,子节点NULL,不保存;返回上一层6,取出6,保存子节点8;取出7,取出8。

3 C++核心代码

 1 /*
 2 struct TreeNode {
 3     int val;
 4     struct TreeNode *left;
 5     struct TreeNode *right;
 6     TreeNode(int x) :
 7             val(x), left(NULL), right(NULL) {
 8     }
 9 };*/
10 class Solution {
11 public:
12     vector<int> PrintFromTopToBottom(TreeNode* root) {
13         vector<int> res;
14         if (root == nullptr) return res;
15         queue<TreeNode*> que;
16         que.push(root);
17         while (!que.empty())
18         {
19             TreeNode* node = que.front();
20             if (node->left){
21                 que.push(node->left);
22             }
23             if (node->right){
24                 que.push(node->right);
25             }
26             res.push_back(node->val);
27             que.pop();
28         }
29         return res;
30     }
31 };

4 C++完整代码

 1 #include<iostream>
 2 #include <vector>
 3 #include <queue>
 4
 5 using namespace std;
 6
 7 struct TreeNode {
 8     int val;
 9     struct TreeNode *left;
10     struct TreeNode *right;
11     TreeNode(int x) :
12         val(x), left(NULL), right(NULL) {
13     }
14 };
15
16 class Solution {
17 public:
18     vector<int> PrintFromTopToBottom(TreeNode* root) {
19         vector<int> res;
20         if (root == nullptr) return res;
21         queue<TreeNode*> que;
22         que.push(root);
23         while (!que.empty())
24         {
25             TreeNode* node = que.front();
26             if (node->left){
27                 que.push(node->left);
28             }
29             if (node->right){
30                 que.push(node->right);
31             }
32             res.push_back(node->val);
33             que.pop();
34         }
35         return res;
36     }
37 };
38
39 int main()
40 {
41     Solution* s = new Solution();
42     TreeNode* t1 = new TreeNode(1);
43     TreeNode* t2 = new TreeNode(2);
44     TreeNode* t3 = new TreeNode(3);
45     TreeNode* t4 = new TreeNode(4);
46     TreeNode* t5 = new TreeNode(5);
47     t1->left = t2;
48     t1->right = t3;
49     t2->left = t4;
50     t2->right = t5;
51     s->PrintFromTopToBottom(t1);
52     //cout <<  << endl;
53
54     system("pause");
55     return 0;
56 }

参考资料

https://blog.csdn.net/aaa958099161/article/details/90344313

https://blog.csdn.net/sxs11/article/details/75286814

原文地址:https://www.cnblogs.com/wxwhnu/p/11411454.html

时间: 2024-11-08 23:41:58

剑指offer22:从上往下打印出二叉树的每个节点,同层节点从左至右打印。的相关文章

剑指offer22

package jianzhiOffer; import java.util.ArrayList; /**  * 从上往下打印出二叉树的每个节点,同层节点从左至右打印.  *   * @author user 思路:本题中我们利用层序遍历的思想,首先将树中所有节点 按照一层从左到右依次保存到ArrayList中,然后在逐一取出  *         节点的值添加到集合中,最后返回集合.  */ class TreeNode3 { int val = 0; TreeNode3 left = nul

一起来刷《剑指Offer》——不修改数组找出重复的数字(思路及Python实现)

数组中重复的数字 在上一篇博客中<剑指Offer>-- 题目一:找出数组中重复的数字(Python多种方法实现)中,其实能发现这类题目的关键就是一边遍历数组一边查满足条件的元素. 然后我们在博客用最复杂的方式学会数组(Python实现动态数组)这篇博客中介绍了数组这一结构的本质,并自己动手实现了一个动态数组. 今天我们介绍一下另一道来自<剑指Offer>的关于数组的面试题--不修改数组找出重复的数字. 不修改数组找出重复的数字 题目二:不修改数组找出重复的数字 给定一个长度为 n+

剑指offer系列47:堆成的二叉树

这个题的主要思路是: 用二叉树的左子树的右子树和右子树的左子树比较,再用左子树的左子树和右子树的右子树比较.(好像有点绕,但其实就是堆成的思想) 剑指offer的说法是用数的前序遍历的两个方法,前序遍历应该是:根->左->右.但是我们用另一种前序遍历:根->右->左.如果这两个序列一样就判断它是对称的. 这两个方法在实现上其实是一样的. 1 class Solution { 2 public: 3 bool isSymmetrical(TreeNode* pRoot) 4 { 5

C++从上往下打印出二叉树的每个节点,同层节点从左至右打印(牛客剑指offer)

/* struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { } }; */ class Solution { public: vector<int> PrintFromTopToBottom(TreeNode *root) { queue<TreeNode *> Q; vector<

剑指架构师系列-Linux下的调优

1.I/O调优 CentOS下的iostat命令输出如下: $iostat -d -k 1 2 # 查看TPS和吞吐量 参数 -d 表示,显示设备(磁盘)使用状态:-k某些使用block为单位的列强制使用Kilobytes为单位:1 10表示,数据显示每隔1秒刷新一次,共显示2次. tps:该设备每秒的传输次数,也就是一次I/O请求.多个逻辑请求可能会被合并为"一次I/O请求"."一次传输"请求的大小是未知的. kB_read/s:每秒从设备读取的数据量:kB_wr

输入一棵二元树,从上往下按层打印每个节点,每层从左往右打印。利用队列。

mport java.util.ArrayDeque; class TreeNode { TreeNode left; TreeNode right; int val; TreeNode(int x) { val = x; } } public class test { public void print(TreeNode root) { ArrayDeque<TreeNode> queue = new ArrayDeque<>(); if(root == null) { retu

从上往下打印出二叉树的每个节点,同层节点从左至右打印。

1 /* 2 思路:借助栈来实现 3 树为空时 返回空 4 树不为空 将根节点如队列 5 然后将队列首元素出队列 如果该元素有左子节点那么左子节点入队了 如果该元素有右子节点那么右子节点入队列 6 最后 进队列的顺序也就是出队列的顺序 7 */ 8 import java.util.ArrayList; 9 import java.util.*; 10 import java.util.Iterator; 11 /** 12 public class TreeNode { 13 int val

从上往下打印出二叉树的每个结点,同一层的结点按照从左到右的顺序打印

题目: 解答: 首先创建BinaryTreeNode 1 public class BinaryTreeNode { 2 int data; 3 BinaryTreeNode lchind; 4 BinaryTreeNode rchind; 5 6 public BinaryTreeNode(int data) { 7 this.data = data; 8 lchind = null; 9 rchind = null; 10 } 11 12 private int getData() { 13

(C++实现)从上往下打印出二叉树的每个节点,同层节点从左至右打印。

/* struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { } };*/ class Solution { public: vector<int> PrintFromTopToBottom(TreeNode* root) { vector<int> a; queue<TreeNod