二叉树的层序遍历详细讲解(附完整C++程序)

1 说明

  二叉树的层序遍历是面试经常会被考察的知识点,甚至要求当场写出实现过程。笔者先后被腾讯和滴滴面试官问过这个问题,腾讯面试官是让称述整个实现过程,本人自信满满的说出来了,所以也没有对具体实现太上心。等到滴滴面试的时候,让我详细写出实现,真正上手之后发现原理懂,但是如果没有朝一个正确的方向努力原来还是蛮棘手的,等下我再说本人卡壳在哪个地方了。

2 原理介绍

  层序遍历所要解决的问题很好理解,就是按二叉树从上到下,从左到右依次打印每个节点中存储的数据。如下图:


这里写图片描述

  按层序遍历的原则,打印顺序依次应该是:A->B->C->D->E->F->G。
  看完是不是感触非常深,这不就是队列数据结构最拿手的绝活吗,FIFO,先进先出!我从上到下,从左到右依次将每个数放入到队列中,然后按顺序依次打印就是想要的结果。
  实现方案的确很好想到,但是具体实现容易卡壳在你是将什么放入队列中。本人当时面试仅存储每个数据到队列中,造成访问完A,然后将B和C(左右孩子)放入队列,并且删除最前面一个数(当前也就是A),这样B就轮到了最前方。想着是依次下去,但是如果队列仅存数据就会发现,不知道后面如何顺序访问下去,也不知道二叉树何时停止。所以正确的方式是队列中每个节点应该是存储一个二叉树的指针,这样才能依次依靠指针left和right访问下去。
  原理还是挺简单的,笔者认为除了上面需要主要其他都挺好理解的,下面直接看C++程序以及程序中注解吧。

3 C++实现程序

#include<cstdio>
#include<queue>
using namespace std;
/*二叉树结构体,并且构建了有参构造函数*/
struct BinaryTree{
    int vec;
    BinaryTree* left;
    BinaryTree* right;
    BinaryTree(int data)
        :vec(data), left(nullptr), right(nullptr){ 
    }
};
/*队列实现层序遍历*/
void printTree(BinaryTree* arr[])
{
    queue<BinaryTree*> rel; //定义一个队列,数据类型是二叉树指针,不要仅是int!!不然无法遍历
    rel.push(arr[0]);
    while (!rel.empty())
    {
        BinaryTree* front = rel.front();
        printf("%d\n", front->vec);
        rel.pop();                  //删除最前面的节点
        if (front->left != nullptr) //判断最前面的左节点是否为空,不是则放入队列
            rel.push(front->left);  
        if (front->right != nullptr)//判断最前面的右节点是否为空,不是则放入队列
            rel.push(front->right);
    }
}
int main(){
    /*构建二叉树*/
    BinaryTree* s_arr[6];
    s_arr[0] = new BinaryTree(0);
    s_arr[1] = new BinaryTree(1);
    s_arr[2] = new BinaryTree(2);
    s_arr[3] = new BinaryTree(3);
    s_arr[4] = new BinaryTree(4);
    s_arr[5] = new BinaryTree(5);
    s_arr[0]->left = s_arr[1];  //   0
    s_arr[0]->right = s_arr[2]; //  1  2
    s_arr[1]->left = s_arr[3];  // 3     5
    s_arr[3]->left = s_arr[4];  //4
    s_arr[2]->right = s_arr[5]; //所以层序遍历的结果为:0 1 2 3 5 4
    /*层次遍历打印所有节点*/
    printTree(s_arr);
    /*释放所有空间*/
    for (int i = 0; i < 6; i++)
        delete s_arr[i];
    return 0;
}

  个人学习记录,由于能力和时间有限,如果有错误望读者纠正,谢谢!
  转载请注明出处:http://blog.csdn.net/FX677588/article/details/74276513

  • 19
    点赞
  • 66
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
好的,下面是Java实现二叉树层序遍历完整源码: ```java import java.util.ArrayList; import java.util.LinkedList; import java.util.List; import java.util.Queue; public class BinaryTreeLevelOrderTraversal { // 定义二叉树节点类 public static class TreeNode { int val; TreeNode left; TreeNode right; TreeNode(int x) { val = x; } } public static List<List<Integer>> levelOrder(TreeNode root) { List<List<Integer>> result = new ArrayList<>(); if (root == null) { return result; } Queue<TreeNode> queue = new LinkedList<>(); queue.offer(root); while (!queue.isEmpty()) { int levelSize = queue.size(); List<Integer> levelList = new ArrayList<>(); for (int i = 0; i < levelSize; i++) { TreeNode node = queue.poll(); levelList.add(node.val); if (node.left != null) { queue.offer(node.left); } if (node.right != null) { queue.offer(node.right); } } result.add(levelList); } return result; } public static void main(String[] args) { // 构建二叉树 TreeNode root = new TreeNode(3); root.left = new TreeNode(9); root.right = new TreeNode(20); root.right.left = new TreeNode(15); root.right.right = new TreeNode(7); // 输出层序遍历结果 List<List<Integer>> result = levelOrder(root); for (List<Integer> levelList : result) { System.out.println(levelList); } } } ``` 这份代码中,我们定义了一个 `TreeNode` 类作为二叉树节点,使用了 `Queue` 类来实现广度优先搜索,最终返回了一个二维列表,其中每个子列表代表一层节点的值。在 `main` 函数中,我们构建了一个二叉树,并输出了其层序遍历的结果。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值