链式二叉树

文章介绍了如何基于普通二叉树创建链式结构,包括节点的插入函数、前序、中序和后序遍历方法,以及计算节点个数、树的深度和查找特定节点的功能。重点在于理解二叉树的基本操作,为后续学习更复杂的树结构打下基础。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

普通二叉树增删查改没什么价值(用来存数据太复杂了)

在普通二叉树的基础之上增加一些性质才有意义,例如:搜索二叉树(最多查找高度次)。

那么普通二叉树不关注增删查改,它关注遍历结构

目的:1,为以后学习更有用的树打基础。2,很多oj题有普通二叉树

因为二叉树增删查改太复杂,所以我们直接创建一个树

链式二叉树建立

BTNode* BuyNode(BTDataType x)
{
	BTNode* node = (BTNode*)malloc(sizeof(BTNode));
	if (node==NULL)
	{
		printf("malloc fail");
		exit(-1);
	}
	node->data = x;
	node->left = node->right = NULL;
	return node;

}
BTNode* CreatBinaryTree()
{
	BTNode* nodeA = BuyNode('A');
	BTNode* nodeB = BuyNode('B');
	BTNode* nodeC = BuyNode('C');
	BTNode* nodeD = BuyNode('D');
	BTNode* nodeE = BuyNode('E');
	BTNode* nodeF = BuyNode('F');
	BTNode* nodeG = BuyNode('G');
	nodeA->left = nodeB;
	nodeA->right = nodeC;
	nodeB->left = nodeD;
	nodeC->left = nodeE;
	nodeC->right = nodeF;
	nodeF->right = nodeG;
	return nodeA;
}

前序,中序,后续遍历

void PrevOrder(BTNode* root)
{
	if (root == NULL)
	{
		return NULL;
	}
	printf("%c ", root->data);
	PrevOrder(root->left);
	PrevOrder(root->right);

}
void InOrder(BTNode* root)
{
	if (root == NULL)
	{
		return NULL;
	}
InOrder(root->left);
	printf("%c ", root->data);
	
	InOrder(root->right);
}
void PostOrder(BTNode* root)
{
	if (root == NULL)
	{
		return NULL;
	}
PostOrder(root->left);
	PostOrder(root->right);
	printf("%c ", root->data);
	
}

节点个树

int BinaryTreeSize(BTNode* root)
{
	if (root == NULL)
	{
		return 0;
	}
	return BinaryTreeLeafSize(root->left) + BinaryTreeLeafSize(root->right) + 1;
}

叶子节点个树

int BinaryTreeLeafSize(BTNode* root)
{
	if (root == NULL)
	{
		return 0;
	}
	if (root->left == NULL && root->right == NULL)
	{
		return 1;
	}
	return BinaryTreeLeafSize(root->left) + BinaryTreeLeafSize(root->right);
}

求第K层节点个数

int BinaryTreeLevelKSize(BTNode* root, int k)
{
	if (root == NULL)
	{
		return 0;
	}
	if (k == 1)
	{
		return 1;
	}
	 
	return BinaryTreeLevelKSize(root->left, k - 1) + BinaryTreeLevelKSize(root->right, k - 1);
}

转换成求左右子树第k-1层的节点个数

二叉树深度

int BinaryTreeDepth(BTNode* root)
{
	if (root == NULL)
	{
		return 0;
	}
	int rightdepth = BinaryTreeDepth(root->right);
	int leftdepth = BinaryTreeDepth(root->left);
	return rightdepth > leftdepth ? rightdepth+1 : leftdepth+1;
}

将左右子树深度保存起来避免多次调用浪费堆栈

查找

BTNode* TreeFind(BTNode* root, BTDataType x)
{
	if (root == NULL)
	{
		return NULL;
	}
	if (root->data == x)
	{
		return root;
	}
	BTNode* left = TreeFind(root->left,x );
	if (left)
	{
		return left;
	}
	BTNode* right = TreeFind(root->right,x );
	if (right)
	{
		return right;
	}
	return NULL;
}

定义left是为了如果左树已经找到了就可以避免再去找右树算是一种优化

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值