按层次顺序创建和遍历二叉树

第一篇博客,献给了数据结构--二叉树。

最近在学数据结构,总结一下二叉树的按层次创建的方法,希望对此时的你有所帮助~

有错误的地方,还望大神指出,或者有其他更好的方法,欢迎留言~

/*利用顺序队列,层次建立二叉树*/

#include <iostream>
using namespace std;
#define MAXSIZE 100
 
struct tnode   //树的数据结构
{
	int data;
	tnode *lchild, *rchild;
};

struct queue  //队列的数据结构
{
	tnode *data[MAXSIZE];
	int front, rear;
};

void creat(queue &q);   //创建一个空队列
void enqueue(queue &q,tnode *t);   //将t入队
tnode *dequeue(queue &q);   //出队,并返回对头元素
bool isempty(queue &q);    //判断队列是否为空
tnode *creatbintree();    //按层次顺序创建一棵二叉树,并返回根节点
void showbintree(tnode *root);  //层次遍历二叉树

int main()
{
	tnode *root = NULL;
	root = creatbintree();
	showbintree(root);
	system("pause");
	return 0;
}

void creat(queue &q)
{
	q.front = q.rear = 0;
}

void enqueue(queue &q, tnode *t)
{
	if ((q.rear + 1) % MAXSIZE == q.front)
	{
		cout << "栈满,不能进栈" << endl;
		return;
	}
	q.rear = (q.rear + 1) % MAXSIZE;
	q.data[q.rear] = t;
}

tnode *dequeue(queue &q)
{
	tnode *t;
	q.front = (q.front + 1) % MAXSIZE;
	t= q.data[q.front];	
	return t;
}

bool isempty(queue &q)
{
	return (q.front == q.rear);
}

tnode *creatbintree()
{
	//1.先将根节点入队,当队列不为空时,循环执行以下操作:
	//2.输入左子树的值,不为空,将其入队
	//3.输入右子树的值,不为空,将其入队
	int a;
	tnode *root;
	queue Q;
	creat(Q);
	cout << "请输入节点值以-1表示空节点:" << endl;
	cin >> a;
	if (a == -1)    //如果第一个节点为空,就直接返回空树
		return NULL;
	else
	{
		root = new tnode;
		root->data = a;
		enqueue(Q, root);  //根节点入队
	}
	while (!isempty(Q))   //当队列不为空
	{
		//先输入左孩子的值,再输入右孩子的值
		tnode *p= dequeue(Q);
		cin >> a;
		if (a == -1)   //左孩子为空
			p->lchild = NULL;
		else
		{
			p->lchild = new tnode;
			p->lchild->data = a;
			enqueue(Q, p->lchild);  //左孩子入队
		}
		cin >> a;
		if (a == -1)   //右孩子为空
			p->rchild = NULL;
		else
		{
			p->rchild = new tnode;
			p->rchild->data = a;
			enqueue(Q, p->rchild);   //右孩子入队
		}

	}
	return root;
}

void showbintree(tnode *root)
{
	//1.先将根节点入队,当队列不为空时,循环执行以下操作:
	//2.出队一个元素,访问它
	//3.若左子树不为空,将其入队
	//4.若右子树不为空,将其入队
	queue Q;
	tnode *p;
	creat(Q);
	if (root == NULL)
		return;
	enqueue(Q, root);
	while (!isempty(Q))
	{
		p = dequeue(Q);
		cout << p->data << ' ';
		if(p->lchild)
		  enqueue(Q, p->lchild);
		if(p->rchild)
		  enqueue(Q, p->rchild);
	}
	cout << endl;
}

  • 19
    点赞
  • 61
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,我已经接收到您的问题。以下是我的回答: 建立二叉树的过程主要包括创建二叉链表和构建二叉树两个操作。创建二叉链表是指为二叉树中的每个结点建立一个数据域和两个指针域,指针域分别指向该结点的左右子节点。 构建二叉树是指根据用户输入的数据和指针关系构建二叉树的过程。建立一棵二叉树可以采用递归算法,代码如下: ``` typedef struct Node { int data; struct Node *lchild, *rchild; } Node; Node* createBinaryTree() { int data; scanf("%d", &data); if (data == -1) { return NULL; } Node *root = (Node*) malloc(sizeof(Node)); root->data = data; root->lchild = createBinaryTree(); root->rchild = createBinaryTree(); return root; } ``` 其中,输入的-1表示当前结点没有子树。根据此递归规则输入一段序列即可建立一棵二叉树。 以下是先序、中序、后序和层次遍历的代码实现: ``` void preOrder(Node *root) { // 先序遍历 if (!root) { return; } printf("%d ", root->data); preOrder(root->lchild); preOrder(root->rchild); } void inOrder(Node *root) { // 中序遍历 if (!root) { return; } inOrder(root->lchild); printf("%d ", root->data); inOrder(root->rchild); } void postOrder(Node *root) { // 后序遍历 if (!root) { return; } postOrder(root->lchild); postOrder(root->rchild); printf("%d ", root->data); } void levelOrder(Node *root) { // 层次遍历 if (!root) { return; } queue<Node*> q; q.push(root); while (!q.empty()) { Node *front = q.front(); printf("%d ", front->data); if (front->lchild) { q.push(front->lchild); } if (front->rchild) { q.push(front->rchild); } q.pop(); } } ``` 以下是按中序顺序非递归遍历的代码实现: ``` void inOrderTraversal(Node* root) { // 中序遍历非递归算法 stack<Node*> s; Node *cur = root; while (!s.empty() || cur) { if (cur) { s.push(cur); cur = cur->lchild; } else { cur = s.top(); s.pop(); printf("%d ", cur->data); cur = cur->rchild; } } } ``` 以下是交换二叉树中所有结点的左、右孩子的非递归算法: ``` void swapChild(Node* root) { // 交换二叉树中的左右孩子 if (!root) { return; } stack<Node*> s; s.push(root); while (!s.empty()) { Node *cur = s.top(); s.pop(); Node *temp = cur->lchild; cur->lchild = cur->rchild; cur->rchild = temp; if (cur->lchild) { s.push(cur->lchild); } if (cur->rchild) { s.push(cur->rchild); } } } ``` 以上就是我的全部回答,请问还有其他问题吗?
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值