二叉树——层序遍历(迭代+同考点题)

102. 二叉树的层序遍历

给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。

  • 树中节点数目在范围 [0, 2000] 内
  • -1000 <= Node.val <= 1000

 解题思路:利用队列先进先出的特性,将二叉树的头节点入队列,然后一旦出队,则将其左右节点入队。直到队列为空。

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public List<List<Integer>> levelOrder(TreeNode root) {
        List<List<Integer>> ress = new ArrayList();
        if(root == null){
            return ress;
        }
        Queue queue = new LinkedList();
        queue.add(root);
        while(!queue.isEmpty()){
            int size = queue.size();
            List<Integer> res = new ArrayList();
            for(int i = 0 ; i < size ;i++){
                TreeNode node = (TreeNode)queue.remove();
                if(node.left != null){
                    queue.add(node.left);
                }
                if(node.right != null){
                    queue.add(node.right);
                }
                res.add(node.val);
            }
            ress.add(res);
        }
        return ress;
    }
}

总结:会了层序遍历,下面这10道题,可以秒。 

  • 102.二叉树的层序遍历
  • 107.二叉树的层次遍历II
  • 199.二叉树的右视图
  • 637.二叉树的层平均值
  • 429.N叉树的前序遍历
  • 515.在每个树行中找最大值
  • 116.填充每个节点的下一个右侧节点指针
  • 117.填充每个节点的下一个右侧节点指针II
  • 104.二叉树的最大深度
  • 111.二叉树的最小深度

二叉树层序遍历是一种广度优先搜索的算法,它按照从上到下、从左到右的顺序遍历二叉树的节点。在C语言中,可以使用队列来实现二叉树层序遍历。 首先,我们需要定义二叉树的节点结构: ```c struct TreeNode { int val; struct TreeNode* left; struct TreeNode* right; }; ``` 然后,我们可以使用队列来辅助进行层序遍历。具体步骤如下: 1. 创建一个队列,并将根节点入队。 2. 当队列不为空时,执行以下操作: - 出队一个节点,并访问该节点。 - 如果该节点的左子节点不为空,则将左子节点入队。 - 如果该节点的右子节点不为空,则将右子节点入队。 3. 重复步骤2,直到队列为空。 下面是一个示例代码实现: ```c #include <stdio.h> #include <stdlib.h> struct TreeNode { int val; struct TreeNode* left; struct TreeNode* right; }; // 创建一个新的二叉树节点 struct TreeNode* createNode(int val) { struct TreeNode* newNode = (struct TreeNode*)malloc(sizeof(struct TreeNode)); newNode->val = val; newNode->left = NULL; newNode->right = NULL; return newNode; } // 层序遍历二叉树 void levelOrderTraversal(struct TreeNode* root) { if (root == NULL) { return; } // 创建一个队列 struct TreeNode** queue = (struct TreeNode**)malloc(sizeof(struct TreeNode*) * 1000); int front = 0; int rear = 0; // 根节点入队 queue[rear++] = root; while (front < rear) { // 出队一个节点 struct TreeNode* node = queue[front++]; // 访问该节点 printf("%d ", node->val); // 左子节点入队 if (node->left != NULL) { queue[rear++] = node->left; } // 右子节点入队 if (node->right != NULL) { queue[rear++] = node->right; } } free(queue); } int main() { // 创建一个二叉树 struct TreeNode* root = createNode(1); root->left = createNode(2); root->right = createNode(3); root->left->left = createNode(4); root->left->right = createNode(5); // 层序遍历二叉树 printf("层序遍历结果:"); levelOrderTraversal(root); return 0; } ``` 运行以上代码,输出结果为:1 2 3 4 5,表示二叉树层序遍历结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值