层序遍历打印二叉树

比如输入的二叉树是

E

  D             G

A  B  C  F

要求打印出的结果是

E

D G

A B C F

字母之间用空格隔开,不同层用换行隔开。

 1 #include <iostream>
 2 #include <vector>
 3 #include <string>
 4 #include <queue>
 5 #include <stack>
 6 #include <unordered_map>
 7 #include <map>
 8 #include <algorithm>
 9 using namespace std;
10
11 struct TreeNode {
12     char val;
13     struct TreeNode *left;
14     struct TreeNode *right;
15     TreeNode(char x) : val(x), left(NULL), right(NULL) {}
16 };
17
18 //以前序遍历创建二叉树
19 void CreateBiTree(TreeNode **T)//*T是指向BiTNode的指针
20 {
21     *T = new TreeNode(0);
22     if (*T == NULL)//如果*T还是指向NULL,表示内存分配失败,退出程序
23         exit(OVERFLOW);
24     char ch;
25     cin >> ch;
26     if (ch == ‘#‘)
27         *T = NULL;
28     else
29     {
30         (*T)->val = ch;//*T指向的节点的data分配内容,即生成根节点
31         CreateBiTree(&((*T)->left));//创建&(*T)->lchild临时变量,传入CreateBiTree,构造左子树
32         CreateBiTree(&((*T)->right));//创建&(*T)->rchild临时变量,传入CreateBiTree,构造右子树
33     }
34 }
35
36 //层序遍历打印二叉树
37 void order(TreeNode* root)
38 {
39     if(root == nullptr)
40         return;
41
42     queue<pair<TreeNode*,int>> que;
43     que.push(make_pair(root,1));
44     int curLevel=1;
45
46     while(!que.empty())
47     {
48         TreeNode *temp=que.front().first;
49         int id = que.front().second;
50         if(id != curLevel)
51         {
52             cout << endl;
53             curLevel = id;
54         }
55         cout << temp->val << " ";
56         if (temp->left)
57         {
58             que.push(make_pair(temp->left,id+1));
59         }
60         if (temp->right)
61         {
62             que.push(make_pair(temp->right,id+1));
63         }
64         que.pop();
65     }
66     return;
67 }
68
69 //测试
70 int main()
71 {
72     TreeNode **pp;//定义指向BiTNode的二级指针pp
73     TreeNode *p;//定义指向BiTNode的指针p
74     pp = &p;//pp指向p
75     p = NULL;//初始化p指向NULL
76     CreateBiTree(pp);//传入指向p的地址,创建二叉树,输入EDA##B##GC##F##
77     order(p);
78 }
时间: 2024-07-30 09:37:24

层序遍历打印二叉树的相关文章

二叉树的层序遍历和二叉树的线索化

先根,后子树:先左子树,后右子树 二叉树的根节点 a 入队 a 的子树,根节点 b 和 c 分别入队 然后 b 的子树的根节点入队(为空) c 的子树的根节点入队 d 的子树的根节点入队(为空) e 的子树的根节点入队 f 的子树的根节点入队(为空) g的子树的根节点入队(为空)结束层序遍历,整个过程就是一层层的遍历,依靠一个队列来存放临时查找的结点. 二叉树线索化 问题的提出:当以二叉链表作为存储结构时,只能找到结点的左右孩子的信息,而不能直接找到结点的任一序列的前驱与后继信息,这种信息只有在

二叉树的层序遍历、二叉树叶节点输出算法、求二叉树的高度、层序创建一棵二叉树

二叉树的层序遍历 1 void LevelorderTraversal(BinTree BT) 2 { 3 std::queue<BinTree> Queue; 4 BinTree T; 5 if (!BT) 6 return; //若是空树则直接返回 7 Queue.push(BT); 8 while (!Queue.empty()) 9 { 10 T = Queue.front(); 11 Queue.pop(); 12 printf("%c ", T->Data

二叉树 二叉树的性质 存储结构 遍历二叉树 C实现二叉树的创建和遍历 线索二叉树

定义 二叉树(binary tree)是n(n>=0)个结点的有限集合,该集合为空集合称为空二叉树,或者有一个根结点和两棵互不相交的,分别称为树根结点的左孩子树和右孩子树组成. 二叉树的特点 每个结点最多有两棵子树,所以二叉树总没有度大于2的结点 左子树和右子树是有顺序的,次数不能任意颠倒 即使树中某结点只有一棵子树,也要区分是左子树还是右子树 特殊的二叉树 1. 斜树 所有的结点都只有左子树的二叉树称为左斜树; 所有的结点都只有右子树的二叉树称为右斜树; 这两者统称为斜树 2. 满二叉树 在一

剑指Offer--&gt;从上向下打印二叉树(层序遍历 + 详解)

这道题目难度一般,重要的是想到以队列作为辅助来解决. 分析:因为按层打印的顺序决定了先打印的应该为根结点.为了接下来能够打印值为 8 的结点的两个子结点,应该在遍历到该结点时把值为 6 和 10 的两个结点保存到一个容器里,此时容器中含有 6 和 10 两个结点.按照从左到右的要求,先取出值为 6 的结点.打印出值 6 之后分别把 5 和 7 两个左右子结点放入容器 ,此时容器中的结点有三个,分别是10 . 5 和 7 .接下来我们从容器中取出值为 10 的结点,注意到 10 比另外两个元素先进

c++智能指针和二叉树(1): 图解层序遍历和逐层打印二叉树

二叉树是极为常见的数据结构,关于如何遍历其中元素的文章更是数不胜数. 然而大多数文章都是讲解的前序/中序/后序遍历,有关逐层打印元素的文章并不多,已有文章的讲解也较为晦涩读起来不得要领.本文将用形象的图片加上清晰的代码帮助你理解层序遍历的实现,同时我们使用现代c++提供的智能指针来简化树形数据结构的资源管理. 那么现在让我们进入正题. 使用智能指针构建二叉树 我们这里所要实现的是一个简单地模拟了二叉搜索树的二叉树,提供符合二叉搜索树的要求的插入功能个中序遍历.同时我们使用shared_ptr来管

笔试算法题(37):二叉树的层序遍历 &amp; 最长递增的数字串

出题:要求层序遍历二叉树,从上到下的层次,每一层访问顺序为从左到右,并将节点一次编号,输出如下:如果只要求打印指定的level的节点,应该如何实现. a b  c d  e  f  g h  i  分析: 原始的层序遍历类似于BFS,打印当前访问的节点curNode的序列号,并将其直接子节点放入队列queue中,然后从queue中取出下一个节点,直 到队列为空:此方法仅能按照层序打印所有节点,并不能区分每一层节点的数量:如果需要区分当前层次的节点,和当前层次节点的子节点,可以使用两个队列 que

层序遍历二叉树

周末要给老师写个期中考试的题解 最后两道题全都是关于二叉树的一些算法 层序遍历二叉树直接输入数据,建立二叉排序树,利用队列层序输出即可,没什么难度 贴下自己的代码 //功能:层序遍历二叉树 //时间:2014-11-23 #include <iostream> #include <queue> using namespace std; //二叉链表数据结构定义 #define TElemType int typedef struct BiTNode{ TElemType data;

数据结构——二叉树层序遍历

层序遍历,即宽度优先遍历,在本算法中,我们还需要将每一层进行分开打印, 对于上图所示的二叉树,我们希望打印出的结果是: 1 2 3 4 5 6 7 8 首先,我们看一下二叉树节点是什么样的: class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; } } 具体实现中,我们采用last表示当前打印的行的最后一个元素的引用

二叉树的遍历:先序中序后序遍历的递归与非递归实现及层序遍历

对于一种数据结构而言,遍历是常见操作.二叉树是一种基本的数据结构,是一种每个节点的儿子数目都不多于2的树.二叉树的节点声明如下: 1 typedef struct TreeNode *PtrToNode; 2 typedef struct TreeNode *BinTree; 3 4 struct TreeNode 5 { 6 int Data; //为简单起见,不妨假设树节点的元素为int型 7 BinTree Left; 8 BinTree Right; 9 }; 二叉树的遍历主要有先序遍历