zoukankan      html  css  js  c++  java
  • 进阶实验4-3.4 笛卡尔树 (25分)--二叉排序树+堆排序

     解题思路:

    1、首先找出根结点,建二叉树

    2、先判断是否是二叉排序树

          如果是,则判断是否满足堆排序的要求

          否则,退出

    #include <stdio.h>
    #include <string.h>
    #include <malloc.h>
    #define MAX 1000
    #define INF_MIN 0xc0c0c0c0
    typedef enum {false,true
                 } bool;
    typedef struct {
        int k1;
        int k2;
        int left;
        int right;
    } Tree;
    Tree T1[MAX];
    typedef struct {
        Tree *Data;
        int Top;
        int MaxSize;
    }*Stack;
    Stack CreateStack(int size) {
        Stack S=(Stack)malloc(sizeof(Stack));
        S->Data=(Tree*)malloc(sizeof(Tree)*size);
        S->MaxSize=size;
        S->Top=-1;
        return S;
    }
    bool IsEmpty(Stack S) {
        if(S->Top==-1)
            return true;
        return false;
    }
    void Push(Stack S,Tree x) {
        S->Data[++(S->Top)]=x;
    }
    Tree Pop(Stack S) {
        return S->Data[(S->Top)--];
    }
    int CreateTree(Tree T[]) {//建二叉树
        int n;
        scanf("%d",&n);
        int check[n];
        memset(check,0,sizeof(check));
        int i,root=-1;
        for(i=0; i<n; i++) {
            scanf("%d %d %d %d",&T[i].k1,&T[i].k2,&T[i].left,&T[i].right);
            check[T[i].left]=1;
            check[T[i].right]=1;
        }
        for(i=0; i<n; i++) {//找根结点
            if(!check[i]) {
                root=i;
                break;
            }
        }
        return root;
    }
    int max=INF_MIN;
    int JudgeBiSearchTree(Tree T[],int r1,Stack S) {//判断是否二叉排序树
        int p=r1;
        while(!IsEmpty(S)||p!=-1) {
            while(p!=-1) {
                Push(S,T[p]);
                p=T[p].left;
            }
            Tree tmp=Pop(S);
            if(tmp.k1>max)
                max=tmp.k1;
            else
                return false;
            p=tmp.right;
        }
        return true;
    }
    int Judge(int r1,Tree T[]) {//判断是否堆排序
        if(r1==-1)
            return 1;
        if(T[r1].left==-1&&T[r1].right==-1)
            return 1;
        if((T[r1].left!=-1&&T[r1].right==-1)) {
            if(T[r1].k2<T[T[r1].left].k2)
                return Judge(T[r1].left,T);
            return 0;
        }
        if((T[r1].left==-1&&T[r1].right!=-1)) {
            if(T[r1].k2<T[T[r1].right].k2)
                return Judge(T[r1].right,T);
            return 0;
        }
        if((T[r1].left!=-1&&T[r1].right!=-1)) {
            if(T[r1].k2<T[T[r1].left].k2&&T[r1].k2<T[T[r1].right].k2)
                return Judge(T[r1].left,T)&&Judge(T[r1].right,T);
            return 0;
        }
    
    }
    int main() {
        int r1=CreateTree(T1);
        Stack S=CreateStack(MAX);
        if(JudgeBiSearchTree(T1,r1,S)) {
            if(Judge(r1,T1))
                printf("YES");
            else
                printf("NO");
        } else
            printf("NO");
    
    }
    勤能补拙,熟能生巧
  • 相关阅读:
    10.5 实现任务的自动调度
    6.2 常见多媒体标准及压缩技术
    南海区行政审批管理系统接口规范v0.3(规划)4.2.【queryExpireList】当天到期业务查询
    南海区行政审批管理系统接口规范v0.3(规划)4.1.【queryAcceptById】业务明细查询
    域名相关的一些基础知识
    域名相关的一些基础知识
    NTP时间服务器介绍
    NTP时间服务器介绍
    NTP时间服务器介绍
    运维实用操作命令
  • 原文地址:https://www.cnblogs.com/snzhong/p/12458134.html
Copyright © 2011-2022 走看看