二叉树结构

二叉树准备数据

#define MAXLEN 20//最大长度
typedef char DATA;//定义元素类型
typedef struct CBT//定义二叉树结点类型
{
	DATA data;//元素数据
	struct CBT* left;//左子树结点指针
	struct CBT* right;//右子树结点指针
}CBTType;

初始化二叉树

CBTType* InitTree()//初始化二叉树的根
{
	CBTType* node;
	if(node=(CBTType*)malloc(sizeof(CBTType)))//申请内存
	{
		printf("请输入一个根结点数据:\n");
		scanf("%s",&node->data);
		node->left=NULL;
		node->right=NULL;
		if(node!=NULL)//如果二叉树根节点不为空
		{
			return node;
		}
		else
		{
			return NULL;
		}
	}
	return NULL;
}

在这里,首先申请内存,然后由用户输入一个根结点数据,并将指向左子树和右子树的指针设置为空,即可完成二叉树的初始化工作。

添加结点

void AddTreeNode(CBTType* treeNode)
{
	CBTType *pnode,*parent;
	DATA data;
	char menusel;
	if(pnode=(CBTType*)malloc(sizeof(CBTType)))
	{
		printf("输入二叉树结点数据:\n");
		fflush(stdin);//清空输入缓冲区
		scanf("%s",&data);
		pnode->left=NULL;
		pnode->rignt=NULL;//设置左右子树为空
		
		printf("输入该结点的父结点数据:\n");
		fflush(stdin);//清空输入缓冲区
		scanf("%s",%data);
		parent=TreeFindNode(treeNode,data);//查找指定数据的结点
		if(!parent)
		{
			printf("未找到该父结点!\n");
			free(pnode);//释放创建的结点内存
			return;//退出函数
		}
		printf("1.添加该结点到左子树\n2.添加该结点到右子树\n");
		
		do
		{
			cin>>menusel;
			if(menusel=='1'||menusel=='2')
			{
				if(parent==NULL)
				{
					printf("不存在父结点,请先设置父结点!\n");
				}
				else
				{
					switch(menusel)
					{
						case 1:
							if(parent->left)//左子树不为空
							{
								printf("左子树结点不为空!\n");
							}
							else
							{
								parent->left=pnode;
							}
							break;
						case 2:
							if(parent->left)//左子树不为空
							{
								printf("左子树结点不为空!\n");
							}
							else
							{
								parent->left=pnode;
							}
							break;
						default:
							printf("无效参数!\n");
					}
				}
			}
		}while(menusel!=1&&menusel!=2)//添加结点结束条件
	}
}

查找结点
查找结点就是遍历二叉树中的每一个结点,逐个比较数据,当找到目标数据时将返回该数据所在结点的指针。查找结点的示例代码如下所示:

CBTType *TreeFindNode(CBTType* treeNode,DATA data)
{
	CBTType* ptr;
	if(treeNode==NULL)
	{
		return NULL;
	}
	else
	{
		if(treeNode->data=data)
		{
			return treeNode;
		}
		else
		{
			if(ptr=TreeFindNode(treeNode->left,data))
			{
				return ptr;
			}
			else if(ptr=TreeFindNode(treeNode->right,data))
			{
				return ptr;
			}
			else
			{
				return NULL;
			}
		}
	}
}

计算二叉树深度

int TreeDepth(CBTType* treeNode) 
{
	if (treeNode== NULL)
		return 0;
	int nLeft = TreeDepth(treeNode->left);//左子树深度(递归调用)
	int nRight = TreeDepth(treeNode->right);//右子树深度
	return (nLeft>nRight) ? (nLeft+1):(nRight+1);
}

清空二叉树

void ClearTree(CBTType* treeNode)
{
	if(treeNode)
	{
		ClearTree(treeNode->left);//清空左子树
		ClearTree(tree->right);//清空右子树
		free(treeNode);//释放当前结点所占内存
		treeNode=NULL;
	}
}

显示结点数据

void TreeNodeData(CBTType* p)
{
	printf("%c",p->data);
}

遍历二叉树

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值