数据结构(二叉树-链式存储)

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

#define TREE_TYPE char
#define EMPTY '#'
#define END '\0'

//	设计二叉树节点结构
typedef struct TreeNode
{
	TREE_TYPE data;
	struct TreeNode* left;
	struct TreeNode* right;
}TreeNode;

//	创建节点
TreeNode* create_tree_node(TREE_TYPE data)
{
	TreeNode* node = malloc(sizeof(TreeNode));
	node->data = data;
	node->left = NULL;
	node->right = NULL;
	return node;
}

//	按照前序顺序 构建二叉树 结束后返回这颗二叉树的根节点
TreeNode* create_tree(void)
{
	TREE_TYPE data = 0;
	scanf("%c",&data);

	if(EMPTY == data) return NULL;
	//	创建根节点
	TreeNode* root = create_tree_node(data);
	//	左子树继续通过前序构建
	root->left = create_tree();
	//	右子树同样前序构建
	root->right = create_tree();

	return root;
}

//	第二种前序构建
/*
TreeNode* create_tree_str(const char** str)
{
	if(EMPTY == **str || END == **str) return NULL;

	//	构建当前根节点
	TreeNode* node = create_tree_node(**str);

	//	继续前序构建左子树
	*str+=1;
	node->left = create_tree_str(str);
	//	继续前序构建右子树
	*str+=1;
	node->right = create_tree_str(str);

	return node;
}
*/
TreeNode* _create_tree_str(const char* str,int* index)
{
	if(END == str[*index] || EMPTY == str[*index]) return NULL;

	TreeNode* node = create_tree_node(str[*index]);
	*index+=1;
	node->left = _create_tree_str(str,index);
	*index+=1;
	node->right = _create_tree_str(str,index);
	return node;
}

TreeNode* create_tree_str(const char* str)
{
	int index = 0;
	_create_tree_str(str,&index);
}


//	前序
void dlr_show(TreeNode* root)
{
	if(NULL == root) return;
	printf("%c ",root->data);
	dlr_show(root->left);
	dlr_show(root->right);
}

//	中序
void ldr_show(TreeNode* root)
{
	if(NULL == root) return;
	ldr_show(root->left);
	printf("%c ",root->data);
	ldr_show(root->right);
}
//	后序
void lrd_show(TreeNode* root)
{
	if(NULL == root) return;
	lrd_show(root->left);
	lrd_show(root->right);
	printf("%c ",root->data);
}

//	树的高度
int high_tree(TreeNode* root)
{
	if(NULL == root) return 0;
	int lh = high_tree(root->left);
	int rh = high_tree(root->right);
	return lh>rh ? lh+1 : rh+1;
}
//	树的密度
int density_tree(TreeNode* root)
{
	if(NULL == root) return 0;
	return density_tree(root->left) + density_tree(root->right) + 1;
}
//	插入 把新节点插入到有空子树的父节点下 假设节点值不重复 
bool insert_tree(TreeNode* root,TREE_TYPE pdata,TREE_TYPE data)
{
	if(NULL == root) return false;

	if(root->data == pdata)
	{
		if(NULL == root->left)
			return root->left = create_tree_node(data);
		if(NULL == root->right)
			return root->right = create_tree_node(data);
		return false;
	}

	if(insert_tree(root->left,pdata,data)) return true;
	return insert_tree(root->right,pdata,data);
}


int main(int argc,const char* argv[])
{
	const char* str = "ABDG###EH##I##C#FJ###";
	//TreeNode* root = create_tree();
	TreeNode* root = create_tree_str(str);
	
	insert_tree(root,'C','X');

	dlr_show(root);
	printf("\n");
	ldr_show(root);
	printf("\n");
	lrd_show(root);
	printf("\n");
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值