青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

Just enjoy programming

二叉查找樹實現

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

/*結構體節點*/
typedef struct  _node{
    int key;
    struct _node *left;
    struct _node *right;
    struct _node *parent;
}node;


/*插入節點*/
void insert(node *root,node *toInsert)
{
    node *p,*q;
    p=root;
    q=NULL;
    if(toInsert==NULL || root==NULL)
    {
        return;
    }

    while(p!=NULL)
    {
        q=p;/*記錄父節點*/
        if(toInsert->key<p->key)
        {
            p=p->left;
        }else{
            p=p->right;
        }    
    }
    if(toInsert->key<q->key)
    {
        q->left=toInsert;
    }else{
        q->right=toInsert;
    }
    toInsert->parent=q;
    toInsert->left=NULL;
    toInsert->right=NULL;
}

/*遞歸中序遍歷根節點*/
void middleSearch(node *root)
{
    if(root!=NULL)
    {
        middleSearch(root->left);
        printf("%d\t",root->key);
        middleSearch(root->right);
    }
}
/*先序遍歷*/
void preSearch(node *root)
{
    if(root!=NULL)
    {
        printf("%d\t",root->key);
        preSearch(root->left);
        preSearch(root->right);
    }
}

/*查找返回節點關鍵字為key的節點*/
node* search(node *root,int key)
{
    node *p=root;
    while(p!=NULL)
    {
        if(key<p->key)
        {
            p=p->left;
        }else if(key>p->key)
        {
            p=p->right;
        }else
            break;
    }
    return p;
}

/*查找二叉樹最小值*/
node *minimun(node *root)
{
    node *p=root;
    if(p==NULL)
        return p;
    while(p->left!=NULL)
        p=p->left;
    printf("min %d\n",p->key);
    return p;
}

/*查找二叉樹最大值*/
node *maximun(node *root)
{
    node *p=root;
    if(p==NULL)
        return;
    while(p->right!=NULL)
        p=p->right;
    printf("max %d\n",p->key);
    return p;
}
/*找節點后續*/
node* successor(node *x)
{
    node *p;
    if(NULL==x)
        return x;
    if(x->right!=NULL)
        return minimun(x->right);
    p=x->parent;
    while(p!=NULL && p->right==x)
    {
        x=p;
        p=p->parent;
    }
    return p;
}

/*刪除節點*/
void delete(node *root,node *toDelete)
{
    node *p,*q;
    int key;
    if(root==NULL || toDelete==NULL)
        return ;
    p=toDelete->parent;

    /*第一種情況,要刪除的節點的左右子樹都為空*/
    if(toDelete->left ==NULL && toDelete->right ==NULL)
    {
        if(p==NULL)/*要刪除的是根節點*/
        {
            free(toDelete);
            return;
        }
        if(p->left==toDelete)
        {
            p->left=NULL;
        }else
            p->right=NULL;
        free(toDelete);

    }

    /*第二種情況,要刪除的左子樹為空,右子樹不為空*/
    else if(toDelete->left==NULL)
    {    
        if(p==NULL)
        {
            q=root->right;
            root->key=q->key;
            root->left=q->left;
            root->right=q->right;

            free(q);
            return;
        }
        else if(p->left==toDelete)
        {
            p->left=toDelete->right;
        }else
            p->right=toDelete->right;
        toDelete->right->parent=p;
        free(toDelete);
    }

    /* 第三種情況,要刪除的右子樹為空,左子樹不為空*/
    else if(toDelete->right==NULL)
    {
        if(p==NULL)
        {
            q=root->left;
            root->key=q->key;
            root->left=q->left;
            root->right=q->right;
            root->parent=NULL;
            free(q);
            return;
        }
        else if(p->left==toDelete)
        {
            p->left=toDelete->left;
        }else
            p->right=toDelete->right;
        toDelete->parent=p;
        free(toDelete);
    }

    /* 第四種情況,要刪除的左右子樹都不為空*/
    else{
            q=successor(toDelete);
            key=q->key;
            delete(root,q);
            toDelete->key=key;
    }
}

int main()
{
    node *root;

    int a[12]={15,5,3,12,10,13,6,7,16,20,18,23};
    node *toInsert;
    node *x,*y;
    int i;
    /*創建頭節點*/
    if((root=(node*)malloc(sizeof(node)))==NULL)
    {
        perror("malloc error");
        exit(1);
    }
    root->key=a[0];
    /*插入節點*/
    for(i=1;i<12;i++)
    {
        if((toInsert=(node*)malloc(sizeof(node)))==NULL)
        {
            perror("malloc error");
            exit(1);
        }
        toInsert->key=a[i];
        insert(root,toInsert);
    }

    /*中序遍歷*/
    middleSearch(root);
    printf("\n");
    /*先序遍歷*/
    preSearch(root);
    printf("\n");

    /*最大值*/
    maximun(root);
    /*最小值*/
    minimun(root);

    /*查找關鍵字節點及其前驅*/
    x=search(root,6);
    y=successor(x);
    if(y!=NULL)
        printf("節點 6 后驅 %d\n",y->key);

    x=search(root,3);
    y=successor(x);
    if(y!=NULL)
        printf("節點 3 后驅 %d\n",y->key);


    x=search(root,13);
    y=successor(x);
    if(y!=NULL)
        printf("節點 13 后驅 %d\n",y->key);


    x=search(root,23);
    y=successor(x);
    if(y!=NULL)
        printf("節點 23 后驅 %d\n",y->key);

    /*刪除節點*/
    printf("before delete the node\n");
    x=search(root,13);

    delete(root,x);
    printf("\nafter delete the node\n");
    
    printf("中序遍歷\n");
    middleSearch(root);
    printf("\n先序遍歷\n");
    preSearch(root);

    if((toInsert=(node*)malloc(sizeof(node)))==NULL)
    {
        perror("malloc error");
        exit(1);
    }
    toInsert->key=13;
    insert(root,toInsert);
    printf("\n中序遍歷\n");
    middleSearch(root);
    printf("\n先序遍歷\n");
    preSearch(root);


    printf("\nbefore delete the node\n");
    x=search(root,16);
    delete(root,x);
    printf("\nafter delete the node\n");
    printf("中序遍歷\n");
    middleSearch(root);
    printf("\n先序遍歷\n");
    preSearch(root);

    if((toInsert=(node*)malloc(sizeof(node)))==NULL)
    {
        perror("malloc error");
        exit(1);
    }
    toInsert->key=16;
    insert(root,toInsert);
    printf("\n中序遍歷\n");
    middleSearch(root);
    printf("\n先序遍歷\n");
    preSearch(root);

    printf("\nbefore delete the node\n");
    x=search(root,5);
    delete(root,x);
    printf("\nafter delete the node\n");
    printf("中序遍歷\n");
    middleSearch(root);
    printf("\n先序遍歷\n");
    preSearch(root);
    if((toInsert=(node*)malloc(sizeof(node)))==NULL)
    {
        perror("malloc error");
        exit(1);
    }
    toInsert->key=5;
    insert(root,toInsert);

    printf("\n中序遍歷\n");
    middleSearch(root);
    printf("\n先序遍歷\n");
    preSearch(root);

    printf("\nbefore delete the node\n");
    x=search(root,15);

    delete(root,x);
    printf("\nafter delete the node\n");
   
    printf("中序遍歷\n");
    middleSearch(root);
    printf("\n先序遍歷\n");
    preSearch(root);

    printf("\n");


    printf("before delete the node\n");
    x=search(root,16);

    delete(root,x);
    printf("\nafter delete the node\n");
   
    printf("中序遍歷\n");
    middleSearch(root);
    printf("\n先序遍歷\n");
    preSearch(root);
    printf("\n");



    printf("before delete the node\n");
    x=search(root,18);

    delete(root,x);
    printf("\nafter delete the node\n");
   
    printf("中序遍歷\n");
    middleSearch(root);
    printf("\n先序遍歷\n");
    preSearch(root);
    printf("\n");

    printf("before delete the node\n");
    x=search(root,20);

    delete(root,x);
    printf("\nafter delete the node\n");
   
    printf("中序遍歷\n");
    middleSearch(root);
    printf("\n先序遍歷\n");
    preSearch(root);
    printf("\n");


    printf("before delete the node\n");
    x=search(root,23);

    delete(root,x);
    printf("\nafter delete the node\n");
   
    printf("中序遍歷\n");
    middleSearch(root);
    printf("\n先序遍歷\n");
    preSearch(root);
    printf("\n");
}
 

posted on 2011-03-28 16:15 周強 閱讀(305) 評論(0)  編輯 收藏 引用 所屬分類: 算法

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲欧美日韩在线播放| 亚洲精品免费看| 亚洲区第一页| 亚洲午夜国产一区99re久久| 亚洲资源av| 国产一区二区在线观看免费播放| 国产一区二区三区丝袜| 亚洲欧洲视频| 久久久久欧美| 亚洲视频1区2区| 欧美精品在线观看91| 红桃视频亚洲| 亚洲综合日韩在线| 亚洲韩日在线| 久久久久久精| 国产亚洲一区二区三区| 午夜精品久久久久久久男人的天堂 | 136国产福利精品导航| 99精品视频免费在线观看| 久久免费视频一区| 亚洲一二三区精品| 国产精品sm| 一本色道久久综合亚洲精品不卡| 美女精品一区| 午夜久久黄色| 欧美精品在线网站| 国产精品日韩欧美一区二区三区| 国产欧美日韩在线观看| 久久国产手机看片| 亚洲在线视频免费观看| 欧美日韩在线观看视频| 亚洲午夜精品久久| 亚洲人成亚洲人成在线观看| 久久福利资源站| 国产一区激情| 久久午夜视频| 久久久中精品2020中文| 亚洲精品一区二区三区av| 欧美大片专区| 一区二区三区四区国产| 国产精品美女久久久久久久| 在线综合亚洲| 亚洲视频你懂的| 国产精品久久精品日日| 午夜精品久久久久久99热| 一区二区三区欧美在线| 欧美丝袜一区二区| 亚洲自拍另类| 午夜日本精品| 在线成人h网| 久久xxxx| 亚洲欧美中文在线视频| 欧美视频在线视频| 亚洲视频在线观看网站| 91久久国产综合久久| 麻豆国产精品777777在线 | 欧美日韩一区精品| 亚洲欧美日韩综合aⅴ视频| 亚洲一区网站| 好吊一区二区三区| 亚洲高清资源| 国产精品一二三四| 麻豆精品在线视频| 免费一级欧美片在线播放| 日韩视频在线你懂得| 一区二区高清在线观看| 国产日韩视频| 亚洲激情欧美激情| 国产精品永久免费视频| 六月天综合网| 欧美日韩国产麻豆| 久久露脸国产精品| 欧美另类女人| 久久精品亚洲一区| 欧美激情bt| 久久精品一二三| 欧美成人精品三级在线观看| 一区二区国产日产| 久久精品国产综合| 亚洲调教视频在线观看| 久久久国产91| 亚洲综合二区| 欧美不卡高清| 久久久久网站| 国产精品久在线观看| 麻豆免费精品视频| 夜夜嗨av色一区二区不卡| 99国产精品国产精品久久| 欧美日韩综合在线免费观看| 亚洲欧美精品一区| 亚洲黄色一区| 国内精品99| 亚洲欧美日韩国产中文| 日韩一二三区视频| 欧美日韩在线电影| 久久精品夜色噜噜亚洲a∨| 欧美一区三区三区高中清蜜桃| 亚洲国产精品一区二区第一页| 欧美a级一区| 午夜在线一区二区| 久久精品系列| 久久在线播放| 国产欧美精品xxxx另类| 亚洲午夜91| 一区二区三区四区五区精品视频| 久久久精品日韩| 欧美一区二区三区电影在线观看| 欧美电影在线观看| 欧美成人午夜免费视在线看片| 欧美激情小视频| 久久人人爽爽爽人久久久| 国产精品日韩一区二区| 亚洲精品一区二区三区福利| 影音先锋亚洲视频| 久久久精品动漫| 久久精选视频| 国产亚洲aⅴaaaaaa毛片| 亚洲在线1234| 欧美一区二区成人| 国产欧美日韩一区二区三区在线 | 国产精品久久久久久久久免费桃花 | 亚洲欧美日本国产专区一区| 亚洲天天影视| 国产精品99一区二区| 亚洲第一二三四五区| 国产精品一区二区在线| 亚洲午夜性刺激影院| 亚洲欧美日韩综合国产aⅴ| 欧美亚洲第一区| 亚洲视频在线观看三级| 亚洲国产小视频在线观看| 欧美电影免费观看| 国模私拍视频一区| 午夜精品久久久久久久| 久久午夜国产精品| 亚洲精品一区二区在线| 欧美久久影院| 夜夜精品视频一区二区| 欧美一区二区三区在线| 国产精品久久久久77777| 欧美中文字幕不卡| 亚洲福利视频一区二区| 亚洲深夜影院| 亚洲大胆视频| 亚洲精品国精品久久99热一| 欧美日韩精品免费看| 亚洲综合二区| 欧美成人国产va精品日本一级| 国产精品丝袜白浆摸在线| 欧美一级在线视频| 欧美国产一区二区三区激情无套| 一本色道88久久加勒比精品 | 亚洲制服少妇| 欧美高清视频www夜色资源网| 国产精品swag| 欧美一区二区免费观在线| 亚洲国产成人久久综合| 亚洲自拍电影| 亚洲国产va精品久久久不卡综合| 久久先锋资源| 亚洲一区二区影院| 亚洲成人自拍视频| 欧美在线日韩| 制服丝袜激情欧洲亚洲| 国产精品中文字幕欧美| 欧美77777| 久久av资源网站| 亚洲色图在线视频| 亚洲免费观看在线视频| 国产在线欧美日韩| 欧美日韩精品在线| 久久亚洲综合色| 亚洲在线中文字幕| 亚洲人成啪啪网站| 亚洲精品一区在线观看| 欧美午夜视频网站| 欧美成人免费网站| 久久久国产91| 欧美激情精品久久久久久| 亚洲精品国产精品久久清纯直播 | 麻豆精品视频在线观看| 亚洲图色在线| 亚洲免费av观看| 久久精品91| 国产亚洲精品久久飘花| 免费成人av在线| 欧美一区二区三区视频免费播放| 免费成人小视频| 久久高清国产| 亚洲一区欧美二区| 精品动漫3d一区二区三区免费版 | 韩国一区二区三区美女美女秀| 欧美日韩国产成人高清视频| 久久精品官网| 欧美国产日韩xxxxx| 一区二区三区视频免费在线观看| 国产农村妇女毛片精品久久麻豆| 久热综合在线亚洲精品| 亚洲综合激情| 最新亚洲视频|