429. N 叉树的层序遍历(详细注释)

题目

给定一个 N 叉树,返回其节点值的层序遍历。(即从左到右,逐层遍历)。

树的序列化输入是用层序遍历,每组子节点都由 null 值分隔(参见示例)。
在这里插入图片描述
在这里插入图片描述

在树上使用队列的遍历算法的基本算法

List<Integer> values = new ArrayList<>(); //用于盛放按顺序拿出来的值
Queue<Node> queue = new LinkedList<>();
//用于盛放每一层的节点,队列存放节点。首先将根节点放到队列中,
//当队列不为空时,则在队列取出一个节点,并将其子节点添加到队列中
queue.add(root);//队列加入根节点
while (!queue.isEmpty()){
	Node nextNode = queue.remove();//remove()返回第一个元素,并在队列中将之删除,用于指定对哪个节点的子节点进行遍历
	values.add(nextNode.val);//将拿出来的队列中节点的值放入values数组中
	for(Node child : nextNode.children) { //循环用于按层序遍历顺序把节点放到队列中,这个循环可以用queue.addAll(nextNode.children)代替
		queue.add(child);
		}
}

对于此题的解法:除了上面的内容还需要把得到的values数组按层拆分开来

class Solution {
	public List<List<Integer>> levelOrder(Node root) {
		List<List<Integer>>result= new Arraylist<>();
		if (root == null) return result;
		Queue<Node> queue = new LinkedList<>();
		queue.add(root);
		while(!queue.isEmpty()){
			List<Integer> level = new ArrayList<>();//这个level指的是每一层里面遍历出来的数组。
			int size = queue.size();
			for (int i = 0;i<size;i++) {
				Node nextNode = queue.poll();//这里专门用poll方法替换了remove方法,从而在遍历queue为空的时候,刚好输出一个null
				level.add(node.val);
				queue.addAll(nextNode.children);
				}
				result.add(level);//循环完以后把每一层的数组加入到result数组中去。
		}
		return result;
}
}

题目地址:
429. N 叉树的层序遍历

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
```c #include <stdio.h> #include <stdlib.h> struct Node { int data; struct Node* left; struct Node* right; }; // 创建新节点 struct Node* createNode(int data) { struct Node* node = (struct Node*)malloc(sizeof(struct Node)); node->data = data; node->left = NULL; node->right = NULL; return node; } // 层序遍历 void levelOrderTraversal(struct Node* root) { if (root == NULL) { return; } // 首先创建一个队列,用于存储每一层的节点 struct Node** queue = (struct Node**)malloc(sizeof(struct Node*)); int front = 0; int rear = 0; // 将根节点加入队列中 queue[rear] = root; rear++; while (front < rear) { // 获取队列中的节点 struct Node* current = queue[front]; front++; // 输出当前节点的值 printf("%d ", current->data); // 将当前节点的左右子节点加入队列中 if (current->left != NULL) { queue = (struct Node**)realloc(queue, (rear + 1) * sizeof(struct Node*)); queue[rear] = current->left; rear++; } if (current->right != NULL) { queue = (struct Node**)realloc(queue, (rear + 1) * sizeof(struct Node*)); queue[rear] = current->right; rear++; } } } int main() { // 创建以下二 // 1 // / \ // 2 3 // / \ / \ // 4 5 6 7 struct Node* root = createNode(1); root->left = createNode(2); root->right = createNode(3); root->left->left = createNode(4); root->left->right = createNode(5); root->right->left = createNode(6); root->right->right = createNode(7); printf("Level Order Traversal: "); levelOrderTraversal(root); return 0; } ``` 注释如下: - `struct Node`:定义二的节点结构体,包括节点的值、左子节点和右子节点。 - `createNode`:创建新节点的函数,传入节点的值,返回新节点的指针。 - `levelOrderTraversal`:层序遍历的函数,传入二的根节点。 - `queue`:动态数组,用于存储每一层的节点。 - `front` 和 `rear`:队列的头部和尾部指针,用于出队和入队操作。 - `queue[rear] = root`:将根节点加入队列中。 - `while (front < rear)`:当队列不为空时进行循环。 - `current = queue[front]`:获取队列中的节点。 - `printf("%d ", current->data)`:输出当前节点的值。 - `queue = (struct Node**)realloc(queue, (rear + 1) * sizeof(struct Node*))`:当需要将节点加入队列中时,重新分配队列的空间。 - `queue[rear] = current->left` 和 `queue[rear] = current->right`:将当前节点的左右子节点加入队列中。 - `main`:创建二并调用 `levelOrderTraversal` 函数进行层序遍历
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值