C++ 二叉树的创建,和三种遍历方式的实现

遍历二叉树

先说遍历二叉树,是因为创建二叉树也利用了遍历二叉树时所用到的递归。
在这里插入图片描述
一般情况下,递归都会先左孩子递归,然后右孩子递归。
preOrder(p->lchild);
preOrder(p->rchild);
所以按照上图的二叉树,左递归会一直进入到节点D,这时候再进入左孩子节点递归,发现左孩子为空,就会结束递归,返回到D的那一层函数,继续执行看D节点是否有右孩子,如果有,则重复上述操作。没有则继续退出循环,回到上一层,也就是B节点的函数,查看是否有右孩子,接下来操作就都差不多。

遍历的时候无非就是输出的先后问题,每进入一个节点都要立刻向左孩子递归到该节点最左下角的节点。
前序遍历就是每进入一个节点,如果该节点不为空,就直接输出该节点的数据,然后再递归进入下一层循环。
中序遍历就是先把节点的左孩子节点进行输出,输出了左孩子节点之后再输出该节点,最后再输出右孩子节点。每进入一层循环都要把该节点当成双亲节点,都要考虑是否有孩子节点。
后序遍历就行把左孩子右孩子按照先后输出了,最后再输出该节点。

创建二叉树

创建二叉树可以利用前序遍历进行创建。也就是在进入函数递归之前进行数据输入,然后根据输入判断输入的是节点数据还是空。
在这里插入图片描述
以上图为例,按照前序遍历进行创建二叉树。
输入的顺序是ABD##E##CF###

源码

#include<iostream>
using namespace std;
typedef struct BiTNode
{
	string data;
	BiTNode* lchild, * rchild;
}*BiTree;
void creatBiTree(BiTree& p)
{
	string  S;
	cout << "请按照先序遍历的顺序输入数据,#代表NULL:";
	cin >> S;
	if (S == "#")
	{
		(p) = NULL;
	}
	else
	{
		p = new BiTNode();
		p->data = S;
		creatBiTree(p->lchild);
		creatBiTree(p->rchild);
	}
}
void preOrder(BiTNode* p)
{
	if (p)
	{
		cout << p->data;
		preOrder(p->lchild);
		preOrder(p->rchild);
	}
}
void midOrder(BiTNode* p)
{
	if (p)
	{
		midOrder(p->lchild);
		cout << p->data;
		midOrder(p->rchild);
	}
}
void lastOrder(BiTNode* p)
{
	if (p)
	{
		lastOrder(p->lchild);
		lastOrder(p->rchild);
		cout << p->data;
	}
}
int main()
{
	BiTNode* S = NULL;
	creatBiTree(S);
	cout << "前序遍历结果为:";
	preOrder(S);
	cout << endl<<"中序遍历结果为:";
	midOrder(S);
	cout << endl<<"后序遍历结果为:";
	lastOrder(S);
}

输出结果:
在这里插入图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值