初识二叉树,存储与遍历

二叉树,顾名思义就是有两个叉的树,每个叉又可以在长出两个或一个叉,哈哈哈。

大致这个样子:左边的叫左子树,右边的叫右子树

二叉树的五种形态:

二叉树的遍历:前序(先序),中序,后序,层次遍历。

我们就拿这个二叉树举例:

 前序遍历:根左右的方式,三个三个节点得看比较好遍历

ABC——ABDEC——ABDEGC——ABDEGCF——ABDEGCFH

中序遍历:左根右的方式,还是三三

BAC——DBAC——DBEAC——DBGEAC——DBGEACHF

后序遍历:左右根的方式,三三

BCA——DBCA——DEBCA——DEGBCA——DEGBHFCA

根据中序遍历和其他两种遍历方式可以推出这个二叉树的!

层次遍历:就是一层一层得遍历,

A——ABC——ABCDEF——ABCDEFGH

代码描述:

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
typedef struct Node
{
	int Num;    //数据
	struct Node* LChild;//左子树指针
	struct Node* RChild;//右子树指针
}TREE,*LPTREE;
LPTREE CreateNode(int Num)
{
	LPTREE newNode = (LPTREE)malloc(sizeof(TREE));
	assert(newNode);
	newNode->Num = Num;
	newNode->LChild = NULL;
	newNode->RChild = NULL;
	return newNode;
}
//插入节点:父节点,左子树节点,右子树节点
void InsertNode(LPTREE parent, LPTREE LChild, LPTREE RChild)
{
	parent->LChild = LChild;
	parent->RChild = RChild;
}
//递归方式输出
//前序遍历,根左右
void PreOrder(LPTREE root)
{
	if (root!= NULL)
	{
		printf("%d\t", root->Num);
		PreOrder(root->LChild);
		PreOrder(root->RChild);
	}
}
//中序,左根右
void MidOrder(LPTREE root)
{
	if (root != NULL)
	{
		MidOrder(root->LChild);
		printf("%d\t", root->Num);
		MidOrder(root->RChild);
	}
}
//后序,左右根
void LastOrder(LPTREE root)
{
	if (root != NULL)
	{
		LastOrder(root->LChild);
		LastOrder(root->RChild);
		printf("%d\t", root->Num);
	}
}
//非递归方式遍历,层次遍历
void LayerOrder(LPTREE root)
{
	LPTREE pmove = root;
	LPTREE queue[1024];//创建一个队列
	int front = 0;
	int tail = 0;
	queue[tail++] = pmove;//第一个节点入队
	printf("%d\t", root->Num);
	while (front != tail) {//出队
		pmove = queue[front++];
		//然后让左右子树入队
		if (pmove->LChild!= NULL) {
			queue[tail++] = pmove->LChild;
			printf("%d\t", pmove->LChild->Num);
		}
		else if (pmove->RChild != NULL) {
			queue[tail++] = pmove->RChild;
			printf("%d\t", pmove->RChild->Num);
		}
	}
}
int main()
{
	LPTREE A = CreateNode(1);
	LPTREE B = CreateNode(2);
	LPTREE C = CreateNode(3);
	LPTREE D = CreateNode(4);
	LPTREE E = CreateNode(5);
	InsertNode(A, B, C);
	InsertNode(B, D, NULL);
	InsertNode(C, NULL, E);
	PreOrder(A);
	MidOrder(A);
	LastOrder(A);
	return 0;
}

还有非递归方式的遍历,这种就先不写了;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值