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

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>
            欧美视频在线观看视频极品| 玉米视频成人免费看| 国产精品网站在线播放| 亚洲国产高清自拍| 欧美国产日韩a欧美在线观看| 欧美片在线观看| 欧美激情女人20p| 久久嫩草精品久久久久| 欧美极品一区二区三区| 亚洲国产精品久久| 一区二区三区四区五区精品| 国产三级欧美三级| 久久亚洲私人国产精品va媚药| 欧美黄色成人网| 亚洲精品在线电影| 女人天堂亚洲aⅴ在线观看| 91久久国产综合久久| 国产精品国产三级国产普通话三级 | 性色av一区二区三区在线观看| 欧美一级午夜免费电影| 91久久在线| 亚洲视频香蕉人妖| 亚洲精品国产精品国自产观看| 亚洲一区二区av电影| 欧美自拍丝袜亚洲| 久久经典综合| 欧美黄色小视频| 国产精品一二三| 国产精品日日摸夜夜摸av| 亚洲一区二区精品视频| 99在线精品视频在线观看| 亚洲精品乱码久久久久久日本蜜臀 | 欧美一区激情| 欧美成人午夜免费视在线看片| 玖玖玖免费嫩草在线影院一区| 免费观看30秒视频久久| 亚洲精品一区二区三区不| 欧美91视频| 国产真实乱子伦精品视频| 亚洲欧洲日产国产综合网| 男男成人高潮片免费网站| 美国十次成人| 国产精品亚洲激情| 欧美一级网站| 美女精品自拍一二三四| 亚洲一区二区免费在线| 亚洲欧洲一区二区三区久久| 欧美成人久久| 国产精品激情偷乱一区二区∴| 性欧美8khd高清极品| 麻豆成人综合网| 久久福利资源站| 一区二区三区视频在线观看| 欧美一区二区观看视频| 欧美日韩久久| 国产精品久久一级| 亚洲日本中文字幕区| 欧美在线视频一区二区| 99在线热播精品免费99热| 免费亚洲电影| 国产欧美在线| 久久视频一区二区| 久久综合久久综合久久综合| 国内成+人亚洲| 亚洲精品中文字幕有码专区| 一区二区在线看| 欧美日本一区二区高清播放视频| 欧美一区二区在线看| 欧美午夜剧场| 久久久久久婷| 国产亚洲精品成人av久久ww| 欧美成年人网站| 精品福利免费观看| 久久久噜久噜久久综合| 91久久久久久| 欧美精品一区二区三区在线看午夜| 免费h精品视频在线播放| 黑人巨大精品欧美一区二区| 欧美高清视频www夜色资源网| 狠狠色噜噜狠狠狠狠色吗综合| 欧美在线精品一区| 亚洲电影免费观看高清| 久久久久久久一区二区三区| 亚洲欧美成人在线| 久久综合国产精品| 亚洲高清不卡av| 欧美一区二区三区四区在线观看 | 亚洲三级性片| 欧美色区777第一页| 亚洲一区二区三区精品动漫| 亚洲国产电影| 久久精品国产一区二区三| 亚洲女ⅴideoshd黑人| 国产精品视频一二三| 久久人人爽爽爽人久久久| 一区二区激情视频| 免费观看成人网| 性高湖久久久久久久久| 91久久久久久国产精品| 狠狠色噜噜狠狠狠狠色吗综合| 欧美三级视频| 欧美精品福利| 欧美大片国产精品| 亚洲激情电影在线| 一本大道久久精品懂色aⅴ| 国产欧美91| 国产区精品在线观看| 国产精品久久久久久久app| 欧美二区不卡| 欧美华人在线视频| 欧美日韩一区二区国产| 欧美日产一区二区三区在线观看 | 久久久久久夜| 午夜精品亚洲| 久久九九热免费视频| 亚洲福利视频在线| 蜜臀99久久精品久久久久久软件| 亚洲专区在线| 亚洲国产乱码最新视频 | 最新精品在线| 久久久久久穴| 亚洲精品国产精品乱码不99| 欧美激情精品久久久久| 国产伦精品一区二区三区高清 | 久久亚洲综合网| 亚洲一区日韩在线| 久久精品国产久精国产思思| 欧美国产精品久久| 国外成人网址| 欧美在线亚洲在线| 欧美福利在线| 午夜亚洲福利在线老司机| 欧美精品成人91久久久久久久| 国产精品视频九色porn| 亚洲精品免费网站| 久久亚洲风情| 午夜在线成人av| 国产精品国产成人国产三级| 亚洲电影天堂av| 国内精品美女在线观看| 性欧美xxxx大乳国产app| 一本色道久久88综合日韩精品| 猛干欧美女孩| 亚洲美女免费精品视频在线观看| 亚洲福利视频一区| 欧美va亚洲va国产综合| 亚洲社区在线观看| 性刺激综合网| 国产人妖伪娘一区91| 久久久91精品| 日韩一区二区精品葵司在线| 蜜桃av综合| 欧美中文在线观看国产| 在线观看成人小视频| 欧美高清在线播放| 欧美精品电影在线| 香蕉久久国产| 亚洲人午夜精品免费| 99re6热在线精品视频播放速度 | 夜夜精品视频一区二区| 欧美日韩精品在线观看| 亚洲欧美日韩国产综合在线| 欧美一级网站| 亚洲精品在线视频观看| 亚洲主播在线观看| 久久一区中文字幕| 亚洲精品中文字幕女同| 午夜一区二区三区在线观看 | 午夜在线一区二区| 欧美深夜福利| 亚洲美洲欧洲综合国产一区| 91久久久国产精品| 久久国产精品久久精品国产| 亚洲女同精品视频| 国产精品久久久久久久久久直播| 正在播放欧美一区| 久久久久久伊人| 欧美日韩三级在线| 久久中文字幕导航| 国产精品美女视频网站| 亚洲国产精品悠悠久久琪琪 | 亚洲福利视频一区| 国产伦精品一区二区三区免费| 欧美大片在线影院| 国产九九精品| 亚洲精品女人| 国产欧美亚洲一区| 日韩性生活视频| 亚洲一区二区三区涩| 欧美日韩国产成人在线91| 欧美刺激性大交免费视频| 国产欧美一区二区三区另类精品 | 久久久久网站| 精品1区2区| 亚洲欧美视频在线观看| 另类av导航| 亚洲欧洲在线一区| 亚洲视频一区二区| 国产精品chinese| 欧美专区福利在线|