程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> 編程綜合問答 >> c-求助C語言大神! 二叉排序樹

c-求助C語言大神! 二叉排序樹

編輯:編程綜合問答
求助C語言大神! 二叉排序樹

求用C實現:輸入初始關鍵字序列,構造一個二叉排序樹。 謝謝!
不用C++

最佳回答:


 // 二叉樹_C.cpp : 定義控制台應用程序的入口點。
//

#include "stdafx.h"
#include "malloc.h"
#define MAX 1240

typedef struct bitnode
{
    char data;
    struct bitnode *lchild,*rchild;
}BiTNode,*BiTree;

/*初始化*/
BiTree Initiate()
{
    BiTNode *bt;
    bt=NULL;
    return bt;
}

/*生成根節點*/
BiTree Create(char x,BiTree lbt,BiTree rbt)
{
    BiTree p;
    if((p=(BiTNode *)malloc(sizeof(BiTNode)))==NULL)return NULL;
    p->data=x;
    p->lchild=lbt;
    p->rchild=rbt;
    return p;
}

/*添加左節點*/
BiTree InsertL(BiTree bt,char x,BiTree parent)
{
    BiTree p;
    if(parent==NULL)
    {
        printf("\n插入出錯!\n");
        return NULL;
    }
    if((p=(BiTNode *)malloc(sizeof(BiTNode)))==NULL) return NULL;
    p->data=x;
    p->lchild=NULL;
    p->rchild=NULL;
    if(parent->lchild==NULL) parent->lchild=p;
    else
    {
        p->lchild=parent->lchild;
        parent->lchild=p;
    }
    return bt;
}

/*添加右節點*/
BiTree InsertR(BiTree bt,char x,BiTree parent)
{
    BiTree p;
    if(parent==NULL)
    {
        printf("\n插入出錯!");
        return NULL;
    }
    if((p=(BiTNode *)malloc(sizeof(BiTNode)))==NULL) return NULL;
    p->data=x;
    p->lchild=NULL;
    p->rchild=NULL;
    if(parent->rchild==NULL) parent->rchild=p;
    else
    {
        p->rchild=parent->rchild;
        parent->rchild=p;
    }
    return bt;
}

/*刪除左子樹*/
BiTree DeleteL(BiTree bt,BiTree parent)
{
    BiTree p;
    if(parent==NULL||parent->lchild==NULL)
    {
        printf("\n刪除出錯!");
        return NULL;
    }
    p=parent->lchild;
    parent->lchild=NULL;
    free(p);
    return bt;
}

/*刪除右子樹*/
BiTree DeleteR(BiTree bt,BiTree parent)
{
    BiTree p;
    if(parent==NULL||parent->rchild==NULL)
    {
        printf("\n刪除出錯!");
        return NULL;
    }
    p=parent->rchild;
    parent->rchild=NULL;
    free(p);
    return bt;
}

/*訪問節點值*/
void Vist(BiTree bt)
{
    printf("%c\t",bt->data);
}

/*遞歸前序遍歷*/
void PreOrder(BiTree bt)
{
    if(bt==NULL) return;
    Vist(bt);
    PreOrder(bt->lchild);
    PreOrder(bt->rchild);
}

/*遞歸中序遍歷*/
void InOrder(BiTree bt)
{
    if(bt==NULL) return;
    InOrder(bt->lchild);
    Vist(bt);
    InOrder(bt->rchild);
}

/*遞歸後序遍歷*/
void PostOrder(BiTree bt)
{
    if(bt==NULL) return;
    PostOrder(bt->lchild);
    PostOrder(bt->rchild);
    Vist(bt);
}

/*非遞歸前序遍歷*/
void NRPreOrder(BiTree bt)
{
    BiTNode *stack[MAX],*p; 
    int top=-1;                     //棧初始化為空
    if(bt==NULL) return;
    p=bt;                           //p指向根結點
    while(! (p == NULL && top == -1))
    {
        while(p!=NULL)
        {
            Vist(p);
            top++;
            stack[top]=p;
            p=p->lchild;
        }
        if(top<0) return;
        else 
        {
            p=stack[top];
            top--;
            p=p->rchild;
        }
    }
}

/*非遞歸中序遍歷*/
void NRInOrder(BiTree bt)
{
    BiTNode *stack[MAX],*p; 
    int top=-1;                     //棧初始化為空
    if(bt==NULL) return;
    p=bt;                           //p指向根結點
    while(! (p == NULL && top == -1))
    {
        while(p!=NULL)
        {   
            top++;
            stack[top]=p;
            p=p->lchild;
        }
        if(top<0) return;
        else 
        {   
            p=stack[top];
            Vist(p);
            top--;
            p=p->rchild;
        }
    }
}

/*非遞歸後序遍歷*/
void NRPostOrder(BiTree bt)
{
    BiTNode *stack[MAX];
    int Frist[MAX];         //判斷在棧中的次數,正則第一次,負則第二次
    BiTNode *p; 
    int top=-1;             //棧初始化為空
    if(bt==NULL) return;
    p=bt;                   //p指向根結點
    while(! (p == NULL && top == -1))
    {
        while(p != NULL)
        {   
            top++;
            stack[top]=p;
            Frist[top]=1;
            p=p->lchild;
        }
        if(top > -1)
        {
            if(Frist[top] > 0)
            {
                p=stack[top]->rchild;
                Frist[top]=-Frist[top];
            }
            else
            {
                p=stack[top];
                top--;
                Vist(p);
                p=NULL;
            }
        }
    }
}

/*層次遍歷*/
void LevelOrder(BiTree bt)
{
    BiTNode *Queue[MAX];
    int front,rear;
    if(bt==NULL)return;
    front=-1;
    rear=0;
    Queue[rear]=bt;
    while(front!=rear)
    {
        front++;
        Vist(Queue[front]);                     //出隊,並取值輸出

        if(Queue[front]->lchild!=NULL)          //入隊操作
        {
            rear++;
            Queue[rear]=Queue[front]->lchild;

        }
        if(Queue[front]->rchild!=NULL)
        {
            rear++;
            Queue[rear]=Queue[front]->rchild;
        }
    }
}

int _tmain(int argc, _TCHAR* argv[])
{
    BiTree t,tr=NULL,tl=NULL;
    t=Initiate();
    t=Create('A',tl,tr);
    printf("根節點:\n");
    PreOrder(t);
    t=InsertL(t,'B',t);
    t=InsertR(t,'C',t);
    t=InsertL(t,'D',t->lchild);
    t=InsertR(t,'G',t->lchild->lchild);
    t=InsertL(t,'E',t->rchild);
    t=InsertR(t,'F',t->rchild);
    printf("\n二叉樹遍歷情況如下:\n");
    printf("遞歸法前序遍歷:  ");
    PreOrder(t);
    printf("\n");
    printf("非遞歸法前序遍歷:");
    NRPreOrder(t);
    printf("\n");
    printf("\n");
    printf("遞歸法中序遍歷:  ");
    InOrder(t);
    printf("\n");
    printf("非遞歸法中序遍歷:");
    NRInOrder(t);
    printf("\n");
    printf("\n");
    printf("遞歸法後序遍歷:  ");
    PostOrder(t);
    printf("\n");
    printf("非遞歸法中序遍歷:");
    NRPostOrder(t);
    printf("\n");
    printf("\n");
    printf("層次遍歷:        ");
    LevelOrder(t);
    printf("\n");
    //printf("\n刪除後的為:\n");
    //t=DeleteL(t,t->lchild);
    //printf("前序遍歷:");
    //PreOrder(t);
    return 0;
}

li1310556122
Frost_Jiang
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved