数据结构算法Day09

这篇博客介绍了如何在二叉搜索树中输出所有大于指定key的节点,并提供了判断平衡二叉树的方法。同时,文章详细讲解了直接插入排序、折半插入排序、冒泡排序和快速排序、选择排序这五种经典的排序算法的实现细节。

7、输出二叉搜索树中所有值大于key的结点

进行遍历,如果值大于key直接输出

void OutPut(BiTree T,int key){
    if(T==NULL)
        return;
    if(T->lchild!=NULL)
        OutPut(T->lchild,key);
    if(T->data>key)
        printf("%d",T->data);
    if(T->rchild!=Null)
        OutPut(T->rchild,key);
}

8、判断一个二叉树是否为平衡二叉树

//求二叉树高度
int get_high(BiTree T){
    if(T==NULL)
        ruturn 0;
    else
        hl=get_high(T->lchild);
        hr=get_high(T->rchild);
        return hl>hr?hl+1:hr+1;
}
//判断是否为平衡二叉树
bool Judge_AVL(BiTree T){
    int hl,hr;
    if(T==NULL) 
        return false;
    else{
        hl=get_high(T->lchild);
        hr=get_high(T->rchild);
        if(abs(hl-hr)<=1)
            return Judge_AVL(T->lchild)&&Judge_AVL(T->rchild);
        else
            return false;
    }
}

六、排序

1、直接插入排序

    每次都新插入一个数,数组范围:  

    0-0
    0-1
    0-n-1

void InsertSort(int A[],int n){
    //临时变量与新插入的
    int temp,newnum;
    for(int i=1;i<n;i++){
        newnum=i;
        while(newnum-1>=0 && A[newnum]<A[newnum-1]){
            temp=A[newnum-1];
            A[newnum-1]=A[newnum];
            A[newnum]=temp;
            newnum--;
        }
    }
}            

2、折半插入排序

void InsertSort(int A[], int n){
    int low,high,mid;
    for(int i=2;i<n;i++){
        A[0]=A[i];//设立哨兵
        low=1,high=i;
        while(low<=high){
            mid=(low+high)/2;
            if(A[mid]>A[0])
                high=mid-1;
            else
                low=mid+1;
        }//找到插入位置
        //开始插入 high+1为我们想要插入的位置
        for(int j=i;j>high+1;j--){
            A[j]=A[j-1];
        }
        A[high+1]=A[0];
    }
}

3、冒泡排序

void BubbleSort(int A[],int n){
    int temp;
    for(int i=n-1;i>=0;i--){
        for(int j=1;j<=i;j++){
            if(A[j-1]>A[j]){
                temp=A[j-1];
                A[j-1]=A[j];
                A[j]=temp;
            }
        }
    }
}

4、快速排序

void QuickSort(int A[],int n)
{
    QSort(A,0,n-1);
}

void QSort(int A[],int low,int high)
{
    int pivot;
    if(low<high){
        pivot = Partition(A,low,high);
        Qsort(A,low,pivot-1);
        Qsort(A,pivot+1,high);
    }
}
//一趟快排
int Partition(int A[],int low,int high){
    int pivot;
    pivot=A[low];
    while(low<high){
        while(low<high && A[high]>pivot)
            high--;
        if(low<high){
             A[low]=A[high];
             low++;
        }
        while(low<high && A[low]<pivot)
            low++;
        if(low<high){
            A[high]=A[low];
            high--;
        }
     A[low]=pivot;
     return low;
}

5、选择排序

void SelectSort(int A[], int n){
	int min;
	int jilu;
	for (int i = 0; i < n; i++)
	{
		min = i;
		for (int j = i; j < n; j++)
		{
			if (A[j]<A[min])
			{
				min = j;
			}
		}	
		if (min!=i)
		{
			swap(A, i, min);
		}		
	}
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值