C语言编程练习day6

1、继昨天复写了二叉树的创建以及先序遍历、中序遍历、后续遍历。今天继续复写了“统计二叉树页子结点的个数”和“计算二叉树的高度”。

1.1 统计二叉树页子结点的个数。
代码如下:

//统计叶子结点个数
int leafNum = 0;
int CountLeaves(BinaryTree* root){
	if(root == NULL){
		return -1;
	}
	if(root->lchild == NULL && root->rchild == NULL){
		leafNum++;
	}
	CountLeaves(root->lchild);//递归遍历左子树
	CountLeaves(root->rchild);//递归遍历右子树
	
	return leafNum;
}

注意:
1、统计双分支结点的判断语句为(root->lchild != NULL && root->rchild != NULL)。
2、统计单分支结点的判断语句为((root->lchild != NULL && root->rchild == NULL) || (root->lchild == NULL && root->rchild != NULL))。这个判断语句有点长,可以这样改进:(root->lchild != NULL || root->rchild != NULL)该语句能统计出”单分支结点+双分支结点“,然后再减去(root->lchild != NULL && root->rchild != NULL)统计出的双分支结点,从而得到单分支结点数。

1.2 计算二叉树的高度.
代码如下:

//计算二叉树的高度
int BinaryTreeDepth(BinaryTree* root){
	if(root == NULL){
		return 0;
	}
	int depth = 0;
	int leftDepth = BinaryTreeDepth(root->lchild); //求左子树的高度
	int rightDepth = BinaryTreeDepth(root->rchild );//求右子树的高度
	
	depth = leftDepth > rightDepth ? leftDepth+1 : rightDepth+1;
	
	return depth;
}

2、复习排序算法
输入:待排序序列:4 1 6 5 2 9 6 7 3 4 8
输出:排序后序列(升序):1 2 3 4 4 5 6 6 7 8 9
优化目标:无
2.1 快速排序。
快速排序的思想,这里就不阐述了。通过代码实现,在注释中体现细节。
代码如下:

#include <stdio.h>

/*
*快速排序
*@arr:数组首地址指针
*@start:数组开始位置
*@end:数组结束位置
*/
void quickSort(int* arr, int start, int end){
	int i = start;
	int j = end;
	int temp = arr[start];//存放枢轴元素
	if(i<j){ //确保递归结束时,i仍然小于j
		while(i<j){
			//右半部分
			while(i<j && arr[j] > temp){//如果当前元素大于temp且i<j;j往左移
				j--;
			}
			if(i<j){//元素交换;指针i向右移动一位
				arr[i] = arr[j];
				i++;
			}
			//左半部分
			while(i<j && arr[i] < temp){//如果当前元素小于temp且i<j;i往右移
				i++;
			}
			if(i<j){//元素交换;指针j向左移动一位
				arr[j] = arr[i];
				j--;
			}
		}
		arr[i] = temp; //枢轴元素填入i=j的位置
		quickSort(arr, start, i-1);//继续递归左半部分
		quickSort(arr, j+1, end);//继续递归右半部分
	}
}

int main(){
	
	int arr[10] = {0};
	printf("Please enter 10 numbers to sort.\n");
	//输入10个待排序的数
	for(int i=0; i<10; i++){
		scanf("%d", &arr[i]);
	}
	//调用快速排序函数
	quickSort(arr, 0, 9);
	printf("After quicksort: ");
	//打印输出排序后结果
	for(int j=0; j<10; j++) {
		printf("%d ", arr[j]);
	}
	
}

运行结果:
在这里插入图片描述

2.2 简单选择排序
完整代码:
#include <stdio.h>

/*
*简单选择排序
*@arr:数组首地址指针
*@length:数组长度
/
void selectSort(int
arr, int length){
for(int i=0; i<length; i++){
int min = i; //每趟开始前,将开始位置i保存,做为当前最小位置
for(int j=i+1; j<length; j++){
if(arr[min] > arr[j]){//寻找最小元素位置
min = j;
}
}
if(min != i){//如果当前的最小位置不是i(每趟开始位置),则交换数据
int temp = arr[i];
arr[i] = arr[min];
arr[min] = temp;
}
}
}

int main(){

int arr[10] = {0};
printf("Please enter 10 numbers to sort.\n");
//输入10个待排序的数
for(int i=0; i<10; i++){
	scanf("%d", &arr[i]);
}

//调用快速排序函数
selectSort(arr, 10);
printf("After selectSort: ");
//打印输出排序后结果
for(int j=0; j<10; j++) {
	printf("%d ", arr[j]);
}

}
运行结果:
在这里插入图片描述

总结:今天复写了寒假练习的排序算法以及昨天没写完的二叉树的一些操作。主要目的是回顾一下这些知识,再加深一些理解。同时,注意代码规范,在封装函数时,一定要写明每个函数参数的含义,后面能快速回忆。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

别偷我的猪_09

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值