温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

按层换行打印二叉树

发布时间:2020-06-28 08:42:15 来源:网络 阅读:808 作者:duanjiatao 栏目:编程语言

题目描述:  二叉树,按层打印,并且每层换行


分析:  我们知道,二叉树的层序遍历需要借助队列来实现,每取出一个节点打印,并将该节点的左右孩子放入队列中,依此反复,直到队列为空时,也就完成了二叉树的按层打印。


基本过程如图所示:

按层换行打印二叉树

但是,关键是怎么换行?


分析:要换行则需要知道什么时候换行,由二叉树我们可以分析,我们需要知道每一层最右边的节点,每次打印完这个节点的值后,再打印一个换行即可。于是我们这样做:


定义两个变量,last 和 nlast 

last : 表示正在打印的当前行的最右节点

nlast : 表示下一行的最右节点


步骤:

  1. 开始让 last 等于二叉树的根节点,并将其点放入队列中。

  2. 队头节点出队列,并打印,将该节点的左孩子入队,并让 nlast 等于该节点,将该节点的右孩子入队,并让 nlast 等于该节点。

  3. 如果打印的节点等于 last 当前指向的节点,则打印一次换行,同时让 last 等于 nlast。

  4. 重复步骤2,3,知道队列为空为止。


图示过程如下:

先将 1 入队

按层换行打印二叉树

再将 1 出队,并将 2 ,3 入队,并让 nlast 分别指向 2, 3

按层换行打印二叉树


此时发现,出队列的节点与 last 指向的节点相等,此时,打印换行符。同时让 last 等于 nlast 

重复上述步骤,将 2 出队列,并将 4 入队列,让 nlast 指向 4

按层换行打印二叉树

再将 3 出队列,并将 5,6 入队列,让 nlast 分别指向 5,6 ,此时发现3 等于 last ,则再打印一次换行,并让 last 等于 nlast


按层换行打印二叉树


重复上述步骤,最终结果如下:

按层换行打印二叉树

这样,按层换行打印二叉树就完成啦!


代码如下:

 #pragma once #include<iostream> #include<cassert> #include<queue> using namespace std; template<class T> struct BinaryTreeNode {	BinaryTreeNode(const T& x)	:_data(x)	, _left(NULL)	, _right(NULL)	{}	T _data;	BinaryTreeNode<T>* _left;	BinaryTreeNode<T>* _right; }; template<class T> class BinaryTree { public:	BinaryTree()	:_root(NULL)	{}	BinaryTree(const T* a, size_t size)	{	size_t index = 0;	_root = _CreateTree(a, size, index);	}	~BinaryTree()	{	_DestroyTree(_root);	_root = NULL;	}	void LevelOrder()  //层次遍历	{	_LevelOrder(_root);  //每层换行!	} protected:	BinaryTreeNode<T>* _CreateTree(const T*& a, size_t size, size_t& index) 	                                                            //创建二叉树	{	assert(a);	BinaryTreeNode<T>* NewNode = NULL;	if (index < size && '#' != a[index])	{	NewNode = new BinaryTreeNode<T>(a[index]);	NewNode->_left = _CreateTree(a, size, ++index);	NewNode->_right = _CreateTree(a, size, ++index);	}	return NewNode;	}	void _DestroyTree(BinaryTreeNode<T>*& root)  //销毁二叉树	{	if (NULL == root)	return;	//后序遍历删除结点	_DestroyTree(root->_left);	_DestroyTree(root->_right);	delete root;	root = NULL;	}	void _LevelOrder(BinaryTreeNode<T>*& root)	{	if (NULL == root)	return;	std::queue<BinaryTreeNode<T>*> q;	q.push(root);	BinaryTreeNode<T>* last = root;	BinaryTreeNode<T>* nlast = NULL;	while (!q.empty())	{	BinaryTreeNode<T>* cur = q.front();	cout << cur->_data << " ";	q.pop();	if (cur->_left)	{	q.push(cur->_left);	nlast = cur->_left;	}	if (cur->_right)	{	q.push(cur->_right);	nlast = cur->_right;	}	if (cur == last)	{	cout << endl;	last = nlast;	}	}	cout << endl;	} protected:	BinaryTreeNode<T>* _root; }; void Test1() {	int array[] = { 1, 2, 4, '#', '#', '#', 3, 5, 7, '#', '#', 8, '#', '#', 6 };	BinaryTree<int> t1(array, sizeof(array)/sizeof(int));	t1.LevelOrder(); }






向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI