求用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;
}