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

加qq1126137994 微信liu1126137994 一起学习更多技术

1、原理:

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

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

2、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];  //   0s_arr[0]->right = s_arr[2]; //  1  2s_arr[1]->left = s_arr[3];  // 3     5s_arr[3]->left = s_arr[4];  //4s_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;
}

有一棵二叉树,请设计一个算法,按照层次打印这棵二叉树。

给定二叉树的根结点root,请返回打印结果,结果按照每一层一个数组进行储存,所有数组的顺序按照层数从上往下,且每一层的数组内元素按照从左往右排列。保证结点数小于等于500。

/*
struct TreeNode {int val;struct TreeNode *left;struct TreeNode *right;TreeNode(int x) :val(x), left(NULL), right(NULL) {}
};*/class TreePrinter {
public:vector<vector<int> > printTree(TreeNode* root) {// write code herequeue<TreeNode*> rel;vector<vector<int> > que;if(root==nullptr)return que;rel.push(root);while(!rel.empty()){vector<int> row;int size=rel.size();for(int i=0;i<size;i++){TreeNode* front=rel.front();rel.pop();row.push_back(front->val);if(front->left!=nullptr)rel.push(front->left);if(front->right!=nullptr)rel.push(front->right);}que.push_back(row);}return que;}
};

或者:

/*
struct TreeNode {int val;struct TreeNode *left;struct TreeNode *right;TreeNode(int x) :val(x), left(NULL), right(NULL) {}
};*/class TreePrinter {
public:vector<vector<int> > printTree(TreeNode* root) {// write code herevector<vector<int>> que;if(root==nullptr)return que;TreeNode* last=root;TreeNode* nlast=nullptr;vector<int> row;queue<TreeNode*> rel;rel.push(root);while(!rel.empty()){TreeNode* front = rel.front();rel.pop();if(front->left!=nullptr){nlast=front->left;rel.push(front->left);}if(front->right!=nullptr){nlast=front->right;rel.push(front->right);}row.push_back(front->val);if(front==last){last=nlast;que.push_back(row);row.clear();}}return que;}
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/423163.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

不同DPI下窗体的自适应的有关注意点(转)

不同DPI下窗体的自适应的有关注意点&#xff08;转自&#xff1a;http://hi.baidu.com/superkinger/blog/item/79e047ec6c80563526979197.html&#xff09; 1. 在设计窗体的时候需要考虑是否允许程序在不同DPI自适应窗体&#xff0c;不自适应的优点是在不同的DPI下看到的…

【C++深度剖析教程30】C++中抽象类和接口

加qq1126137994 微信&#xff1a;liu1126137994 1、面向对象中的抽象概念; 在现实中&#xff0c;需要知道具体的图形类型才能知道如何求面积&#xff0c;但是对于抽象的‘图形’&#xff0c;我们是没法求其面积的&#xff0c;而且对其求面积也是没有意义的&#xff1a; cl…

有效沟通力思维导图

有效沟通&#xff0c;适用于生活和工作中&#xff0c;甚至是孩子教育上面&#xff0c;分享一下&#xff1b;

[转]Microsoft Solution Framework 微软解决方案框架结构

本文转自&#xff1a;http://baike.baidu.com/view/1291436.htmMSF&#xff08;Microsoft Solution Framework&#xff09;微软解决方案框架结构是一组建立、开发和实现分布式企业系统应用的工作模型、开发准则和应用指南。它帮助企业融合商业和技术的目标&#xff0c;降低采用…

指针的大小与什么有关

指针的大小与什么有关&#xff1f; cpu位数&#xff08;32位数4字节&#xff0c;64位数8字节&#xff09;操作系统位数&#xff08;32位数4字节&#xff0c;64位数8字节&#xff09;编译器的位数&#xff08;32位数4字节&#xff0c;64位数8字节&#xff09; 当上述3种位数不…

数据结构思维导图

学习是一个不断渐进的过程&#xff0c;最近整理了一下数据结构思维导图&#xff0c;分享一下&#xff0c;后续更新中 总结&#xff1a;算法实际上属于&#xff0c;数据建模&#xff0c;首先是问题的抽象&#xff0c;采用数学公式来表示&#xff08;数据建模&#xff1a;将问题…

(转)代理模式(Proxy)

原文地址&#xff1a;http://www.cnblogs.com/QinBaoBei/archive/2010/05/18/1737866.html 为了深刻点理解代理模式&#xff0c;我们先来看一个 Demo &#xff0c; 首先这个 Demo 是用来测试 QQ 号码是否在线&#xff0c; 这里涉及到的内容是 Web 服务的使用&#xff0c; 这个 …

【C++深度剖析教程31】被遗弃的多重继承

加qq1126137994 微信&#xff1a;liu1126137994 C中是否允许一个类继承多个父类&#xff1f; C支持编写多重继承的代码&#xff1a; 一个子类可以拥有多个父类子类拥有所有父类的成员变量子类继承父类所有的成员函数子类对象可以当做任意父类对象使用 多重继承的语法规则&a…

zookeeper思维导图

之前用word文档记笔记&#xff0c;但是没有思维导图清晰&#xff0c;又整理了一下&#xff0c;分享一下&#xff1b;

管理软件本质论

我们上管理软件到底是为了什么&#xff1f;1 为员工提供自动化工具&#xff0c;可以让他们节省出更多的时间可以做更多的工作&#xff1f;2 可以通过管理软件的互联网联网特性或局域网联网特性&#xff0c;让部门和部门之间、总部和分公司之间按业务流程通常运营&#xff1f;2 …

【C++深度剖析教程32】new/malloc区别 delete/free区别

加qq1126137994 微信&#xff1a;liu1126137994 一起学习更多技术&#xff01;&#xff01;&#xff01; 1、new与malloc的区别&#xff1a; new是关键字&#xff0c;它是C语言的一部分&#xff0c;而malloc是由C库提供的函数new分配的内存的单位是具体的类型大小&#xff0c…

redis 思维导图

之前整理的redis 思维导图&#xff0c;分享一下&#xff0c;后续持续更新;

软件汉化教程

看到网上经常有人问汉化方面的东西&#xff0c;我今天也来灌水一篇&#xff0c;来个汉化扫盲教程。写的不好的地方欢迎大家指正&#xff01;OK&#xff0c;现在我们进入正题。我这里所说的汉化&#xff0c;是指汉化 Windows 下的 PE 文件&#xff0c;把其他语言界面的程序翻译为…

图的DFS深度遍历

最近复习了一下图的内容&#xff0c;记录一下&#xff0c;后续添加详解&#xff08;无向图的深度遍历&#xff09; package com.qey.learn;import java.util.ArrayList; import java.util.Arrays;/*** ClassName graph* Description* Author qianxl* Date 2021-03-06 17:18* V…

【C++深度剖析教程33】C++中的构造函数与析构函数是否可以为虚函数

加qq1126137994 微信&#xff1a;liu1126137994 一起学习更多技术&#xff01;&#xff01;&#xff01; 问题一&#xff1a;构造函数与析构函数可以成为虚函数么&#xff1f; 答案&#xff1a; 1、构造函数不可以成为虚函数 因为在构造函数执行结束后&#xff0c;虚函数表…

网站切图初学

先做一个简单的说明为什么选择Photoshop软件而没有选择Firework软件。Friework Dreamweaver Flash号称网页制作三剑客&#xff0c;Friework与Dreamwaver整合得更为紧密&#xff0c;在这里只所以选择photoshop只是因为我的偏好&#xff0c;况且我对 firework软件使用的次数很少&…

【C++深度剖析教程34】C++中的强制类型转换dynamic_cast

加qq1126137994 微信&#xff1a;liu1126137994 一起学习更多技术&#xff01;&#xff01;&#xff01; C中的继承中&#xff0c;如何使用强制类型转换&#xff1f; 知识点&#xff1a; dynamic_cast是与继承相关的类型转换关键字dynamic_cast要求相关的类中必须有虚函数dy…

main函数的参数的含义

转载自&#xff1a;点击链接 链接2 加qq1126137994 微信&#xff1a;liu1126137994 一起学习更多技术&#xff01;&#xff01;&#xff01; 最近学习服务器网络编程&#xff0c;遇到了一个问题&#xff0c;main函数的参数&#xff0c;特意整理资料记录之&#xff01;&#…

C#FTP操作

C# FTP操作类 收藏 using System;using System.Collections;using System.IO;using System.Net;using System.Net.Sockets;using System.Text;using System.Text.RegularExpressions; namespace Discuz.Common{ /// <summary> /// FTP类 /// </summary> …