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