二叉树的层次遍历

二叉树的层次遍历

【问题描述】首先利用二叉树的前序遍历建立一棵二叉树,然后利用队列实现二叉树的层次遍历并输出结果

【输入形式】假设二叉树的结点为字符型,输入“#”表示空结点,输入为一行字符串,具体见样例输入,二叉树见殷人昆教材P202页,图5.15

二叉树

输出形式】输出只有一行,二叉树的层次遍历结果,输出结点字符值时用一个空格隔开,注意最后一个字符后也有一个空格,具体格式见样例输出

【样例输入】

ABC##DE#G##F###

【样例输出】

A B C D E F G

代码如下:

PS:注意队列结点类型的定义

#include<iostream>

using namespace std;

template<class T>
struct BinTreeNode
{
	T data;
	BinTreeNode<T>* leftchild;
	BinTreeNode<T>* rightchild;
	BinTreeNode()
	{
		leftchild = NULL;
		rightchild = NULL;
	}
	BinTreeNode(T x)
	{
		data = x;
		leftchild = NULL;
		rightchild = NULL;
	}
};

template<class T>
struct QueneNode
{
	BinTreeNode<T>* data;
	QueneNode<T>* link;
	QueneNode()
	{
		data = NULL;
		link = NULL;
	}
	QueneNode(BinTreeNode<T>* x)
	{
		data = x;
		link = NULL;
	}
};


template<class T>
class BinTree
{
public:
	BinTree();
	~BinTree();
	BinTreeNode<T>* Get_root()
	{
		return root;
	}  //返回根结点
	void CreateTree(BinTreeNode<T>*& root);  //创建二叉树
	void DeleTree(BinTreeNode<T>* root);  //销毁二叉树
protected:
	BinTreeNode<T>* root;
};

template<class T>
class Quene
{
public:
	Quene();  //构造函数
	bool EnQuene(BinTreeNode<T>* x);  //入队
	bool DeQuene(BinTreeNode<T>*& x);  //出队
	bool Is_Empty();  //判断队列是否为空
private:
	QueneNode<T>* front;  //队头指针
	QueneNode<T>* rear;  //队尾指针
};

template<class T>
BinTree<T>::BinTree()
{
	root = NULL;
}

template<class T>
BinTree<T>::~BinTree()
{
	DeleTree(root);
}

template<class T>
void BinTree<T>::CreateTree(BinTreeNode<T>*& root)
{
	T x;
	cin >> x;
	if (x == '#')
	{
		root = NULL;
		return;
	}
	root = new BinTreeNode<T>(x);
	if (root == NULL)
		return;
	CreateTree(root->leftchild);
	CreateTree(root->rightchild);
}

template<class T>
void BinTree<T>::DeleTree(BinTreeNode<T>* root)
{
	if (root == NULL)
		return;
	DeleTree(root->leftchild);
	DeleTree(root->rightchild);
	delete root;
}

template<class T>
Quene<T>::Quene()
{
	front = new QueneNode<T>;
	rear = front;
}


template<class T>
bool Quene<T>::EnQuene(BinTreeNode<T>* x)
{
	QueneNode<T>* newnode;
	newnode = new QueneNode<T>(x);
	if (newnode == NULL)
		return false;
	rear->link = newnode;
	rear = newnode;
	return true;
}

template<class T>
bool Quene<T>::DeQuene(BinTreeNode<T>*& x)
{
	QueneNode<T>* p = front->link;
	if (front == rear)
		return false;
	if (p == rear)
		rear = front;
	front->link = p->link;
	x = p->data;
	delete p;
	p = NULL;
	return true;
}

template<class T>
bool Quene<T>::Is_Empty()
{
	if (front == rear)
	{
		return true;
	}
	else
	{
		return false;
	}
}

void Level_Tra(BinTreeNode<char>* root)
{
	BinTreeNode<char>* p = root;
	if (root == NULL)
	{
		return;
	}
	Quene<char> t;
	t.EnQuene(p);
	while (!t.Is_Empty())
	{
		t.DeQuene(p);
		cout << p->data << ' ';
		if (p->leftchild != NULL)
			t.EnQuene(p->leftchild);
		if (p->rightchild != NULL)
			t.EnQuene(p->rightchild);
	}
}

int main()
{
	BinTree<char> tree;
	BinTreeNode<char>* head = tree.Get_root();
	tree.CreateTree(head);
	Level_Tra(head);
	return 0;
}
  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值