从上往下打印二叉树

题目描述

从上往下打印出二叉树的每个节点,同层节点从左至右打印。
 
思路:
路线层序遍历,方法广度优先搜索,工具队列
 
注意点:不同于C/C++,声明队列queue<TreeNode*> p;  //队列里存放的是地址 
 java的queue是接口,需要通过其实现类来完成操作

 

注意:

Queue 接口并未定义阻塞队列的方法,而这在并发编程中是很常见的。BlockingQueue 接口定义了那些等待元素出现或等待队列中有可用空间的方法,这些方法扩展了此接口。

Queue 实现通常不允许插入 null 元素,尽管某些实现(如 LinkedList)并不禁止插入 null。即使在允许 null 的实现中,也不应该将 null 插入到 Queue 中,因为 null 也用作 poll 方法的一个特殊返回值,表明队列不包含元素。

Queue 实现通常未定义 equalshashCode 方法的基于元素的版本,而是从 Object 类继承了基于身份的版本,因为对于具有相同元素但有不同排序属性的队列而言,基于元素的相等性并非总是定义良好的。

 

 

 

 1 import java.util.ArrayList;
 2 import java.util.Queue;
 3 import java.util.LinkedList;
 4 /**
 5 public class TreeNode {
 6     int val = 0;
 7     TreeNode left = null;
 8     TreeNode right = null;
 9 
10     public TreeNode(int val) {
11         this.val = val;
12 
13     }
14 
15 }
16 */
17 public class Solution {
18     public ArrayList<Integer> PrintFromTopToBottom(TreeNode root) {
19           ArrayList<Integer> array=new ArrayList<>();
20         Queue<TreeNode> p = new LinkedList<TreeNode>();
21         if (root == null) {
22             return array;
23         }
24       
25         p.add(root);// 把根节点入队
26 
27         while (!p.isEmpty()) {
28             TreeNode pop1=p.poll();  //每次只会出队一个元素,例如:当前left入队,right入队,left出队,left的俩个孩子入队,然后right出队,right孩子入队...
31             array.add(pop1.val);
32 
33             if (pop1.left != null)
34             p.add(pop1.left);
35             if (pop1.right != null)
36                 p.add(pop1.right);
37 
38         }
39 
40         return array;
41 
42     }
43 
44 }

 

 

转载于:https://www.cnblogs.com/Octopus-22/p/9447048.html

### C语言实现从上到下打印二叉树 要实现从上到下的顺序打印二叉树节点,可以采用层次遍历的方法。这种方法通常借助队列来完成,因为队列具有先进先出的特点,能够按照加入的顺序依次处理每个节点。 以下是完整的代码示例: ```c #include <stdio.h> #include <stdlib.h> // 定义二叉树节点结构体 typedef struct TreeNode { int data; struct TreeNode* lchild; struct TreeNode* rchild; } TreeNode; // 创建新节点 TreeNode* create_node(int value) { TreeNode* node = (TreeNode*)malloc(sizeof(TreeNode)); node->data = value; node->lchild = NULL; node->rchild = NULL; return node; } // 层次遍历并打印二叉树 void level_order_traversal(TreeNode* root) { if (!root) return; // 如果根为空,则直接返回 // 初始化队列 TreeNode** queue = (TreeNode**)malloc(100 * sizeof(TreeNode*)); // 假设最多有100个节点 int front = 0, rear = 0; // 将根节点入队 queue[rear++] = root; while (front != rear) { // 当队列不为空时继续循环 TreeNode* current = queue[front++]; // 取出队首元素 printf("%d ", current->data); // 输出当前节点的数据 // 左子节点存在则将其入队 if (current->lchild) { queue[rear++] = current->lchild; } // 右子节点存在则将其入队 if (current->rchild) { queue[rear++] = current->rchild; } } free(queue); // 释放队列内存 } int main() { // 构建一个简单的二叉树作为测试数据 TreeNode* root = create_node(1); root->lchild = create_node(2); root->rchild = create_node(3); root->lchild->lchild = create_node(4); root->lchild->rchild = create_node(5); // 调用层次遍历函数 printf("Level order traversal of binary tree is:\n"); level_order_traversal(root); return 0; } ``` 上述代码实现了通过队列进行层次遍历的功能[^1]。具体来说,程序会逐层访问二叉树中的每一个节点,并按从左至右的顺序输出其值。如果某个节点还有子节点,则这些子节点会被添加到队列中等待后续处理。 #### 关键点说明: - **队列的作用**:用于存储待访问的节点,确保每次总是优先访问较早进入队列的节点。 - **边界条件**:当输入的二叉树为空时,应立即退出而不执行任何操作。 - **动态分配释放资源**:为了支持不同大小的二叉树,在实际应用中可能需要更灵活地管理队列的空间大小以及及时释放不再使用的内存区域。 此方法的时间复杂度为O(n),其中n表示二叉树中总的节点数;空间复杂度同样也是O(n),因为在最坏情况下整个二叉树的所有节点都可能会被暂时存放在队列里[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值