数据结构——使用C语言 二叉树的实现及二叉树的遍历

二叉树的实现操作包括

//二叉树数据结构定义

/*初始化*/
//初始化二叉树的头结点
void Initiate(BiTreeNode** root);


/*左插入结点*/
//原curr结点非空,则在curr结点的左子树插入元素值为x的新结点
//原curr结点所指结点的左子树变成新插入结点的左子树
//若插入成功,返回新插入结点的指针,否则返回空
BiTreeNode* InsertLeftNode(BiTreeNode* curr, DataType x);


/*右插入结点*/
//curr结点非空,则在curr结点的右子树插入元素值为x的新结点
//原curr结点所指结点的右子树变成新插入结点的右子树
//若插入成功,返回新插入结点的指针,否则返回空
BiTreeNode* InsertRightNode(BiTreeNode* curr, DataType x);


/*左删除子树*/
//若当前结点cuee非空,则删除curr所指结点的左子树
//若删除成功返回删除节点的双亲节点指针,否则返回空
BiTreeNode* DeleteLeftNode(BiTreeNode* curr);

1.定义结构体

typedef char DataType;
//定义二叉树结点结构体
typedef struct Node
{
	DataType data;
	struct Node* leftchild;
	struct Node* rightchild;
}BiTreeNode;

2.初始化

/*初始化*/
//初始化二叉树的头结点
void Initiate(BiTreeNode** root)
{
	*root = (BiTreeNode*)malloc(sizeof(BiTreeNode));
	(*root)->leftchild = NULL;
	(*root)->rightchild = NULL;
}

3.左插入结点

/*左插入结点*/
//原curr结点非空,则在curr结点的左子树插入元素值为x的新结点
//原curr结点所指结点的左子树变成新插入结点的左子树
//若插入成功,返回新插入结点的指针,否则返回空
BiTreeNode* InsertLeftNode(BiTreeNode* curr, DataType x)
{
	BiTreeNode* s, * t;
	if (curr == NULL)
		return NULL;
	t = curr->leftchild;
	s = (BiTreeNode*)malloc(sizeof(BiTreeNode));
	s->data = x;
	s->leftchild = t;
	s->rightchild = NULL;
	curr->leftchild = s;
	return curr->leftchild;
}

4.右插入结点

/*右插入结点*/
//curr结点非空,则在curr结点的右子树插入元素值为x的新结点
//原curr结点所指结点的右子树变成新插入结点的右子树
//若插入成功,返回新插入结点的指针,否则返回空
BiTreeNode* InsertRightNode(BiTreeNode* curr, DataType x)
{
	BiTreeNode* s, * t;
	if (curr == NULL)
		return NULL;
	t = curr->rightchild;
	s = (BiTreeNode*)malloc(sizeof(BiTreeNode));
	s->data = x;
	s->rightchild = t;
	s->leftchild = NULL;
	curr->rightchild = s;
	return curr->rightchild;
}

5.销毁二叉树

/*销毁二叉树*/
void Destroy(BiTreeNode** root)
{
	if ((*root) != NULL && (*root)->leftchild != NULL)
		Destroy(&(*root)->leftchild);
	if ((*root) != NULL && (*root)->rightchild != NULL)
		Destroy(&(*root)->rightchild);
	free(*root);
}

6.左删除子树

/*左删除子树*/
//若当前结点cuee非空,则删除curr所指结点的左子树
//若删除成功返回删除节点的双亲节点指针,否则返回空
BiTreeNode* DeleteLeftNode(BiTreeNode* curr)
{
	if ((curr == NULL) || (curr->leftchild = NULL))
		return NULL;
	Destroy(&curr->leftchild);
	curr->leftchild = NULL;
	return curr;
}

7.右删除子树

/*右删除子树*/
//若当前结点curr非空,则删除curr所指的结点的右子树
//若删除成功返回删除结点的双亲节结点指针,否则返回空
BiTreeNode* DeleteRightNode(BiTreeNode* curr)
{
    if ((curr == NULL) || (curr->rightchild == NULL))
        return NULL;
    Destroy(&curr->rightchild);
    curr->rightchild = NULL;
    return curr;
}

8.前序遍历   (根左右)

/*前序遍历*/
void PreOrder(BiTreeNode* root)
{
	if (root != NULL)
	{
		printf("%c  ", root->data);
		PreOrder(root->leftchild);
		PreOrder(root->rightchild);
	}
}

9.中序遍历(左根右)

/*中序遍历*/
void InOrder(BiTreeNode* root)
{
	if (root != NULL)
	{
		InOrder(root->leftchild);
		printf("%c  ", root->data);
		InOrder(root->rightchild);
	}
}

10.后序遍历(左右根)

/*后序遍历*/
void PostOrder(BiTreeNode* root)
{
	if (root != NULL)
	{
		PostOrder(root->leftchild);
		PostOrder(root->rightchild);
		printf("%c  ", root->data);
	}
}

创建如图所示二叉树并对其进行前中后序遍历

 

程序代码设计如下

#include<stdio.h>
#include"bitree.h"  //包含二叉树头文件
int main()
{
	BiTreeNode* root, * p;
	Initiate(&root);
	p = InsertLeftNode(root, 'A');
	p = InsertLeftNode(p, 'B');
	p = InsertLeftNode(p, 'D');
	p = InsertRightNode(p, 'G');
	p = InsertRightNode(root->leftchild, 'C');
	InsertLeftNode(p, 'E');
	InsertRightNode(p, 'F');
	printf("前序遍历:");
	PreOrder(root->leftchild);
	printf("\n");
	printf("中序遍历:");
	InOrder(root->leftchild);
	printf("\n");
	printf("后序遍历:");
	PostOrder(root->leftchild);

}

程序运行结果如下

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C语言叉树管理系统是一个基于C语言编写的程序,用于管理二叉树数据结构的创建、插入、删除、查找等操作。该系统提供了一系列的功能,以方便用户对二叉树进行操作和管理。 在该系统中,可以通过创建二叉树的初始化函数来创建一个空的二叉树。用户可以输入节点的值,并按照指定的规则来构建二叉树。在构建过程中,每个节点将会按照大小顺序被插入到合适的位置。如果用户希望删除二叉树中的某个节点,系统也提供了删除节点的功能,并且会自动调整二叉树的结构以保持其特性。 在二叉树管理系统中,用户可以输入关键字来查找特定的节点。系统会从根节点开始进行遍操作,并根据关键字的大小关系逐步搜索到相应的节点。如果找到了目标节点,系统会返回该节点的信息,如果没有找到则会给出相应的提示。 除了上述的基本功能外,该二叉树管理系统还提供了其他一些附加功能,如中序遍、前序遍、后序遍等。用户可以选择相应的遍方式,系统将会按照选定的方式遍叉树,并将节点的信息进行展示。 总而言之,C语言叉树管理系统作为一个数据结构的管理工具,方便了用户对二叉树的操作和管理。通过该系统,用户可以轻松地创建、插入、删除和查找二叉树节点,并且可以使用不同的遍方式对二叉树进行遍操作。这个系统不仅提高了二叉树的管理效率,还方便了用户对数据的处理和分析。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值