二叉树的链式存储结构----二叉链表

来源:互联网 发布:乳源县网络问政 编辑:程序博客网 时间:2024/05/18 16:18

头文件:head.h

#include<string.h>#include<ctype.h>#include<malloc.h> /* malloc()等 */#include<limits.h> /* INT_MAX等 */#include<stdio.h> /* EOF(=^Z或F6),NULL */#include<stdlib.h> /* atoi() */#include<io.h> /* eof() */#include<math.h> /* floor(),ceil(),abs() */#include<process.h> /* exit() *//* 函数结果状态代码 */#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define INFEASIBLE -1/* #define OVERFLOW -2 因为在math.h中已定义OVERFLOW的值为3,故去掉此行 */typedef int Status; /* Status是函数的类型,其值是函数结果状态代码,如OK等 */typedef int Boolean; /* Boolean是布尔类型,其值是TRUE或FALSE */#define CHAR//定义字符型//#define INT//定义整型(二选一)#ifdef CHARtypedef char TElemType;//TElemType Nil = ' ';//字符型以空格为空#define form "%c%*c"//输出输出的格式为%c#endif#ifdef INTtypedef int Elemtype;//TElemType Nil = 0;//整型以0为空#define form "%d"//输入输出格式为%d#endiftypedef struct BiTNode{TElemType data;struct BiTNode *lchild, *rchild;//左右孩子指针}BiTNode, *BiTree;Status InitBiTree(BiTree *T);Status DeleteChild(BiTree p, int LR);//Status DestroyBiTree(BiTree *T);Status ClearBiTree(BiTree *T);//Status PreOrderTraverse(BiTree T, Status(*Visit)(TElemType e));//Status InOrderTraverse(BiTree T, Status(*Visit)(TElemType e));//Status CreateBiTree(BiTree *T);//Boolean BiTreeEmpty(BiTree T);//int BiTreeDepth(BiTree T);//TElemType Root(BiTree T);//TElemType Value(BiTree p);//Status Assign(BiTree T, TElemType value);//TElemType Parent(BiTree T, TElemType e);//BiTree Point(BiTree T, TElemType s);//TElemType LeftChild(BiTree T, TElemType e);//TElemType RightChild(BiTree T, TElemType e);//TElemType LeftSibling(BiTree T, TElemType e);//TElemType RightSibling(BiTree T, TElemType e);//Status InsertChild(BiTree p, int LR, BiTree c);//Status DeleteChile(BiTree p, int LR);//Status InOrderTraverse1(BiTree T, void(*Visit)(TElemType));//Status InOrderTraverse2(BiTree T, void(*Visit)(TElemType));//void PostOrderTraverse(BiTree T, Status(*Visit)(TElemType));//void LevelOrderTraverse(BiTree T, Status(*Visit)(TElemType));

算法实现:

#include"head.h"#ifdef CHARTElemType Nil = ' ';//字符型以空格为空#endif#ifdef INTTElemType Nil = 0;//整型以0为空#endif#define ClearBiTree DestroyBiTreeStatus InitBiTree(BiTree *T){//操作结果:构造空的二叉树T//注意:空的和已销毁的二叉树结构都是一样的*T = NULL;return OK;}Status DestroyBiTree(BiTree *T){//初始条件:二叉树T存在//操作结果:销毁二叉树Tif (*T)//非空树{if ((*T)->lchild)//有左孩子DestroyBiTree(&(*T)->lchild);//销毁左孩子子树if ((*T)->rchild)//有右孩子DestroyBiTree(&(*T)->rchild);//销毁右孩子子树free(*T);//释放根节点*T = NULL;//空指针赋0}return OK;}Status PreOrderTraverse(BiTree T, Status(*Visit)(TElemType e)){//初始条件:二叉树存在,Visit是对结点操作的应用函数//操作结果:先序递归遍历T,对每个结点调用函数Visit一次且仅一次if (T)//T不为空{Visit(T->data);//先访问根节点//if (T->lchild)PreOrderTraverse(T->lchild, Visit);//再先序遍历左子树//if (T->rchild)PreOrderTraverse(T->rchild, Visit);//最后先序遍历右子树}return OK;}Status InOrderTraverse(BiTree T, Status(*Visit)(TElemType e)){//初始条件:二叉树存在,Visit是对结点操作的应用函数//操作结果:中序递归遍历T,对每个结点调用函数Visit一次且仅一次if (T){InOrderTraverse(T->lchild, Visit);Visit(T->data);InOrderTraverse(T->rchild, Visit);}return OK;}Status CreateBiTree(BiTree *T){//按照先序次序输入二叉树中结点的值(一个字符),空格字符表示空树//构造二叉链表表示的二叉树TTElemType ch;#ifdef CHARscanf_s("%c", &ch, 1);#endif#ifdef INTscanf_s("%d", ch);#endifif (ch == Nil)*T = NULL;else{(*T) = (BiTree)malloc(sizeof(BiTNode));if (!(*T)){printf("生成树失败!");system("pause");exit(-1);}(*T)->data = ch;//生成根结点CreateBiTree(&(*T)->lchild);//构造左子树CreateBiTree(&(*T)->rchild);//构造右子树}return OK;}Boolean BiTreeEmpty(BiTree T){//初始条件:二叉树T存在//操作结果:若二叉树为空树,返回TRUE;否则,返回FALSE;if (T)return FALSE;elsereturn TRUE;}int BiTreeDepth(BiTree T){//初始条件:二叉树T存在//操作结果:返回T的深度int l, r;//l为左子树的深度,r为右子树的深度//如果树为空,返回深度为0if (!T)return 0;if (T->lchild)//左子树的深度l = BiTreeDepth(T->lchild);elsel = 0;if (T->rchild)//右子树的深度r = BiTreeDepth(T->rchild);elser = 0;return l > r ? l + 1 : r + 1;//深度为其左右子树的深度中的大者加1}TElemType Root(BiTree T){//初始条件:二叉树T存在//操作结果:返回T的根if (BiTreeEmpty(T))return Nil;elsereturn T->data;}TElemType Value(BiTree p){//初始条件:二叉树T存在,p指向T中某个结点//操作结果:返回p所指向的值return p->data;}Status Assign(BiTree T, TElemType value){//给T所指定的结点赋值为valueT->data = value;return OK;}//**************************************************************************typedef BiTree QElemType;//和队列相结合#include"Queue.h"#include"Queue.c"TElemType Parent(BiTree T, TElemType e){//初始条件:二叉树T存在,e是T的某个结点//操作结果:若e是T的非根结点,则返回它的双亲,否则返回空if (BiTreeEmpty(T))return Nil;LinkQueue q;QElemType a;//InitBiTree(&a);InitQueue(&q);//初始化队列EnQueue(&q, T);//树根指针入队while (!QueueEmpty(q))//队列不为空{DeQueue(&q, &a);//出队,队列元素赋给aif (a->lchild&&a->lchild->data == e || a->rchild&&a->rchild->data == e)return a->data;//找到该元素else{if (a->lchild)//若果左孩子不为空,则插入左孩子EnQueue(&q, a->lchild);if (a->rchild)//若果右孩子不为空,则插入右孩子EnQueue(&q, a->rchild);}}return Nil;//树为空或者没有找到e}BiTree Point(BiTree T, TElemType s){//初始条件:树T不为空//操作结果:返回二叉树中指向元素值为s的结点的指针LinkQueue q;QElemType a;if (T){InitQueue(&q);//初始化队列EnQueue(&q, T);while (!QueueEmpty(q)){DeQueue(&q, &a);if (a->data == s)return a;if (a->lchild)EnQueue(&q, a->lchild);if (a->rchild)EnQueue(&q, a->rchild);}}return NULL;}TElemType LeftChild(BiTree T, TElemType e){//初始条件:二叉树T存在,e是T中某个结点//操作结果:返回e的左孩子,若e无左孩子,则返回“空”BiTree a;if (BiTreeEmpty(T))return Nil;a = Point(T, e);if (a && a->lchild)return a->lchild->data;return Nil;}TElemType RightChild(BiTree T, TElemType e){//初始条件:二叉树T存在,e是T中某个结点//操作结果:返回e的右孩子,若e无右孩子,则返回“空”BiTree a;if (BiTreeEmpty(T))return Nil;a = Point(T, e);if (a && a->rchild)return a->rchild->data;return Nil;}TElemType LeftSibling(BiTree T, TElemType e){//初始条件:二叉树T存在,e是T中某个结点//操作结果:返回e的左兄弟,若e无左兄弟,则返回“空”TElemType a;BiTree p;if (BiTreeEmpty(T))//树为空则退出,不再查找return Nil;a = Parent(T, e);//a元素为e的双亲if (a != Nil)//a的双亲不为空{p = Point(T, a);//定位双亲指针if (p->lchild && p->rchild && p->rchild->data == e)//p存在左右孩子且右孩子等于ereturn p->lchild->data;}return Nil;}TElemType RightSibling(BiTree T, TElemType e){//初始条件:二叉树T存在,e是T中某个结点//操作结果:返回e的右兄弟,若e无右兄弟,则返回“空”TElemType a;BiTree p;if (BiTreeEmpty(T))return Nil;a = Parent(T, e);if (a != Nil){p = Point(T, a);if (p->rchild&&p->lchild&&(p->lchild->data) == e)return p->rchild->data;}return Nil;}Status InsertChild(BiTree p, int LR, BiTree c){//初始条件:二叉树T存在,p指向T中的某个结点,LR为0或1,非空二叉树c与T不相交且右子树为空//操作结果:根据LR为0或1,插入c为T中p所指结点的左或右子树,p所指结点的原有左或右子树则成为c的右子树if (p){if (LR == 0){c->rchild = p->lchild;p->lchild = c;}else{c->rchild = p->rchild;p->rchild = c;}return OK;}return ERROR;}Status DeleteChild(BiTree p, int LR){//初始条件:二叉树存在,p指向T中某个结点,LR为0或1//操作结果:根据LR为0或1,删除T中p所指结点的左或右子树if (p){if (LR == 0)ClearBiTree(&(p->lchild));elseClearBiTree(&(p->rchild));return OK;}return ERROR;}//***********************************************************************************typedef BiTree SElemType;#include"Stack.h"#include"Stack.c"Status InOrderTraverse1(BiTree T, void(*Visit)(TElemType)){//采用二叉链表存储结构,Visit是对数据元素操作的应用函数//中序遍历二叉树T的非递归算法,对每个数据元素调用函数VisitSqStack S;InitStack(&S);while (T || !StackEmpty(S)){if (T)//根指针入栈,遍历左子树{Push(&S, T);T = T->lchild;}else                    //根指针退栈,遍历右子树{Pop(&S, &T);Visit(T->data);T=T->rchild;}}printf("\n");return OK;}Status InOrderTraverse2(BiTree T, void(*Visit)(TElemType)){//采用二叉树表存储结构,Visit是对数据元素操作的应用函数//中序遍历二叉树T的非递归算法,对每个元素调用函数VisitSqStack S;BiTree p;InitBiTree(&p);InitStack(&S);Push(&S, T);//根指针入栈while (!StackEmpty(S)){while (GetTop(S, &p) && p)Push(&S, p->lchild);//向左走到尽头Pop(&S, &p);//空指针退栈if (!StackEmpty(S))             //访问根节点,向右一步{Pop(&S, &p);Visit(p->data);Push(&S, p->rchild);}}printf("\n");return OK;}void PostOrderTraverse(BiTree T, Status(*Visit)(TElemType)){ /* 初始条件: 二叉树T存在,Visit是对结点操作的应用函数 *//* 操作结果: 后序递归遍历T,对每个结点调用函数Visit一次且仅一次 */if (T) /* T不空 */{PostOrderTraverse(T->lchild, Visit); /* 先后序遍历左子树 */PostOrderTraverse(T->rchild, Visit); /* 再后序遍历右子树 */Visit(T->data); /* 最后访问根结点 */}}void LevelOrderTraverse(BiTree T, Status(*Visit)(TElemType)){ /* 初始条件:二叉树T存在,Visit是对结点操作的应用函数 *//* 操作结果:层序递归遍历T(利用队列),对每个结点调用函数Visit一次且仅一次 */LinkQueue q;QElemType a;if (T){InitQueue(&q);EnQueue(&q, T);while (!QueueEmpty(q)){DeQueue(&q, &a);Visit(a->data);if (a->lchild != NULL)EnQueue(&q, a->lchild);if (a->rchild != NULL)EnQueue(&q, a->rchild);}printf("\n");}}//****************************************************************************************

引用文件: Queue.h

 /* 单链队列--队列的链式存储结构 */ typedef struct QNode {   QElemType data;   struct QNode *next; }QNode,*QueuePtr; typedef struct {   QueuePtr front,rear; /* 队头、队尾指针 */ }LinkQueue;

队列的算法实现部分:Queue.c

 /* 链队列(存储结构由Queue.h定义)的基本操作(9个) */ Status InitQueue(LinkQueue *Q) { /* 构造一个空队列Q */   (*Q).front=(*Q).rear=(QueuePtr)malloc(sizeof(QNode));   if(!(*Q).front)     exit(OVERFLOW);   (*Q).front->next=NULL;   return OK; } Status DestroyQueue(LinkQueue *Q) { /* 销毁队列Q(无论空否均可) */   while((*Q).front)   {     (*Q).rear=(*Q).front->next;     free((*Q).front);     (*Q).front=(*Q).rear;   }   return OK; } Status ClearQueue(LinkQueue *Q) { /* 将Q清为空队列 */   QueuePtr p,q;   (*Q).rear=(*Q).front;   p=(*Q).front->next;   (*Q).front->next=NULL;   while(p)   {     q=p;     p=p->next;     free(q);   }   return OK; } Status QueueEmpty(LinkQueue Q) { /* 若Q为空队列,则返回TRUE,否则返回FALSE */   if(Q.front==Q.rear)     return TRUE;   else     return FALSE; } int QueueLength(LinkQueue Q) { /* 求队列的长度 */   int i=0;   QueuePtr p;   p=Q.front;   while(Q.rear!=p)   {     i++;     p=p->next;   }   return i; } Status GetHead_Q(LinkQueue Q,QElemType *e) /* 避免与bo2-6.c重名 */ { /* 若队列不空,则用e返回Q的队头元素,并返回OK,否则返回ERROR */   QueuePtr p;   if(Q.front==Q.rear)     return ERROR;   p=Q.front->next;   *e=p->data;   return OK; } Status EnQueue(LinkQueue *Q,QElemType e) { /* 插入元素e为Q的新的队尾元素 */   QueuePtr p=(QueuePtr)malloc(sizeof(QNode));   if(!p) /* 存储分配失败 */     exit(OVERFLOW);   p->data=e;   p->next=NULL;   (*Q).rear->next=p;   (*Q).rear=p;   return OK; } Status DeQueue(LinkQueue *Q,QElemType *e) { /* 若队列不空,删除Q的队头元素,用e返回其值,并返回OK,否则返回ERROR */   QueuePtr p;   if((*Q).front==(*Q).rear)     return ERROR;   p=(*Q).front->next;   *e=p->data;   (*Q).front->next=p->next;   if((*Q).rear==p)     (*Q).rear=(*Q).front;   free(p);   return OK; } Status QueueTraverse(LinkQueue Q,void(*vi)(QElemType)) { /* 从队头到队尾依次对队列Q中每个元素调用函数vi()。一旦vi失败,则操作失败 */   QueuePtr p;   p=Q.front->next;   while(p)   {     vi(p->data);     p=p->next;   }   printf("\n");   return OK; }


引用文件:Stack.h

 /*栈的顺序存储表示 */ #define STACK_INIT_SIZE 10 /* 存储空间初始分配量 */ #define STACKINCREMENT 2 /* 存储空间分配增量 */typedef BiTree SElemType; typedef struct SqStack {   SElemType *base; /* 在栈构造之前和销毁之后,base的值为NULL */   SElemType *top; /* 栈顶指针 */   int stacksize; /* 当前已分配的存储空间,以元素为单位 */ }SqStack; /* 顺序栈 */

栈的算法实现部分:Stack.c

 /* 顺序栈(存储结构由Stack.h定义)的基本操作(9个) */ Status InitStack(SqStack *S) { /* 构造一个空栈S */   (*S).base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType));   if(!(*S).base)     exit(OVERFLOW); /* 存储分配失败 */   (*S).top=(*S).base;   (*S).stacksize=STACK_INIT_SIZE;   return OK; } Status DestroyStack(SqStack *S) { /* 销毁栈S,S不再存在 */   free((*S).base);   (*S).base=NULL;   (*S).top=NULL;   (*S).stacksize=0;   return OK; } Status ClearStack(SqStack *S) { /* 把S置为空栈 */   (*S).top=(*S).base;   return OK; } Status StackEmpty(SqStack S) { /* 若栈S为空栈,则返回TRUE,否则返回FALSE */   if(S.top==S.base)     return TRUE;   else     return FALSE; } int StackLength(SqStack S) { /* 返回S的元素个数,即栈的长度 */   return S.top-S.base; } Status GetTop(SqStack S,SElemType *e) { /* 若栈不空,则用e返回S的栈顶元素,并返回OK;否则返回ERROR */   if(S.top>S.base)   {     *e=*(S.top-1);     return OK;   }   else     return ERROR; } Status Push(SqStack *S,SElemType e) { /* 插入元素e为新的栈顶元素 */   if((*S).top-(*S).base>=(*S).stacksize) /* 栈满,追加存储空间 */   {     (*S).base=(SElemType *)realloc((*S).base,((*S).stacksize+STACKINCREMENT)*sizeof(SElemType));     if(!(*S).base)       exit(OVERFLOW); /* 存储分配失败 */     (*S).top=(*S).base+(*S).stacksize;     (*S).stacksize+=STACKINCREMENT;   }   *((*S).top)++=e;   return OK; } Status Pop(SqStack *S,SElemType *e) { /* 若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR */   if((*S).top==(*S).base)     return ERROR;   *e=*--(*S).top;   return OK; } Status StackTraverse(SqStack S,Status(*visit)(SElemType)) { /* 从栈底到栈顶依次对栈中每个元素调用函数visit()。 */   /* 一旦visit()失败,则操作失败 */   while(S.top>S.base)     visit(*S.base++);   printf("\n");   return OK; }


测试文件:

#include"head.h"TElemType nn = ' ';Status visitT(TElemType e){#ifdef CHARprintf("%c ", e);#endif#ifdef INTprintf("%d ", e);#endifreturn OK;}void main(){int i;BiTree T, p, c;TElemType e1, e2, temp;InitBiTree(&T);printf("构造空二叉树后,树空否?%d(1:是 0:否) 树的深度=%d\n", BiTreeEmpty(T), BiTreeDepth(T));e1 = Root(T);if (e1 != nn)#ifdef CHARprintf("二叉树的根为: %c\n", e1);#endif#ifdef INTprintf("二叉树的根为: %d\n", e1);#endifelseprintf("树空,无根\n");#ifdef CHARprintf("请先序输入二叉树(如:ab三个空格表示a为根结点,b为左子树的二叉树)\n");#endif#ifdef INTprintf("请先序输入二叉树(如:1 2 0 0 0表示1为根结点,2为左子树的二叉树)\n");#endifCreateBiTree(&T);printf("建立二叉树后,树空否?%d(1:是 0:否) 树的深度=%d\n", BiTreeEmpty(T), BiTreeDepth(T));e1 = Root(T);if (e1 != nn)#ifdef CHARprintf("二叉树的根为: %c\n", e1);#endif#ifdef INTprintf("二叉树的根为: %d\n", e1);#endifelseprintf("树空,无根\n");printf("中序递归遍历二叉树:\n");InOrderTraverse(T, visitT);printf("\n中序非递归遍历二叉树:\n");InOrderTraverse1(T, visitT);printf("中序非递归遍历二叉树(另一种方法):\n");InOrderTraverse2(T, visitT);printf("后序递归遍历二叉树:\n");PostOrderTraverse(T, visitT);printf("\n层序遍历二叉树:\n");LevelOrderTraverse(T, visitT);printf("请输入一个结点的值: ");#ifdef CHARwhile (getchar()!='\n');e1 = getchar();#endif#ifdef INTscanf_s("%d", &e1);#endifp = Point(T, e1); /* p为e1的指针 */#ifdef CHARprintf("结点的值为%c\n", Value(p));#endif#ifdef INTprintf("结点的值为%d\n", Value(p));#endifprintf("欲改变此结点的值,请输入新值: ");#ifdef CHARwhile (getchar() != '\n');e2 = getchar();#endif#ifdef INTscanf_s("%d", &e2);#endifAssign(p, e2);printf("层序遍历二叉树:\n");LevelOrderTraverse(T, visitT);e1 = Parent(T, e2);if (e1 != nn)#ifdef CHARprintf("%c的双亲是%c\n", e2, e1);#endif#ifdef INTprintf("%d的双亲是%d\n", e2, e1);#endifelse#ifdef CHARprintf("%c没有双亲\n", e2);#endif#ifdef INTprintf("%d没有双亲\n", e2);#endife1 = LeftChild(T, e2);if (e1 != nn)#ifdef CHARprintf("%c的左孩子是%c\n", e2, e1);#endif#ifdef INTprintf("%d的左孩子是%d\n", e2, e1);#endifelse#ifdef CHARprintf("%c没有左孩子\n", e2);#endif#ifdef INTprintf("%d没有左孩子\n", e2);#endife1 = RightChild(T, e2);if (e1 != nn)#ifdef CHARprintf("%c的右孩子是%c\n", e2, e1);#endif#ifdef INTprintf("%d的右孩子是%d\n", e2, e1);#endifelse#ifdef CHARprintf("%c没有右孩子\n", e2);#endif#ifdef INTprintf("%d没有右孩子\n", e2);#endife1 = LeftSibling(T, e2);if (e1 != nn)#ifdef CHARprintf("%c的左兄弟是%c\n", e2, e1);#endif#ifdef INTprintf("%d的左兄弟是%d\n", e2, e1);#endifelse#ifdef CHARprintf("%c没有左兄弟\n", e2);#endif#ifdef INTprintf("%d没有左兄弟\n", e2);#endife1 = RightSibling(T, e2);if (e1 != nn)#ifdef CHARprintf("%c的右兄弟是%c\n", e2, e1);#endif#ifdef INTprintf("%d的右兄弟是%d\n", e2, e1);#endifelse#ifdef CHARprintf("%c没有右兄弟\n", e2);#endif#ifdef INTprintf("%d没有右兄弟\n", e2);#endifInitBiTree(&c);printf("构造一个右子树为空的二叉树c:\n");#ifdef CHARprintf("请先序输入二叉树(如:ab三个空格表示a为根结点,b为左子树的二叉树)\n");#endif#ifdef INTprintf("请先序输入二叉树(如:1 2 0 0 0表示1为根结点,2为左子树的二叉树)\n");#endifwhile ((temp = getchar() != '\n') && temp != EOF);CreateBiTree(&c);printf("先序递归遍历二叉树c:\n");PreOrderTraverse(c, visitT);printf("\n树c插到树T中,请输入树T中树c的双亲结点 c为左(0)或右(1)子树: ");#ifdef CHARwhile ((temp = getchar() != '\n') && temp != EOF);//清空多余的输入//e1 = getchar();scanf_s("%c %d", &e1, 1, &i);#endif#ifdef INTscanf_s("%d%d", &e1, &i);#endifp = Point(T, e1); /* p是T中树c的双亲结点指针 */InsertChild(p, i, c);printf("先序递归遍历二叉树:\n");PreOrderTraverse(T, visitT);printf("\n删除子树,请输入待删除子树的双亲结点  左(0)或右(1)子树: ");#ifdef CHARwhile ((temp = getchar() != '\n') && temp != EOF);//清空多余的输入scanf_s("%c %d",&e1, 1, &i);//scanf_s("%*c%c%d", &e1, &i);#endif#ifdef INTscanf_s("%d%d", &e1, &i);#endifp = Point(T, e1);DeleteChild(p, i);printf("先序递归遍历二叉树:\n");PreOrderTraverse(T, visitT);printf("\n");DestroyBiTree(&T);system("pause");}


Running Result:

构造空二叉树后,树空否?1(1:是 0:否) 树的深度=0树空,无根请先序输入二叉树(如:ab三个空格表示a为根结点,b为左子树的二叉树)abdg   e  c f建立二叉树后,树空否?0(1:是 0:否) 树的深度=4二叉树的根为: a中序递归遍历二叉树:g d b e a c f中序非递归遍历二叉树:g d b e a c f中序非递归遍历二叉树(另一种方法):g d b e a c f后序递归遍历二叉树:g d e b f c a层序遍历二叉树:a b c d e f g请输入一个结点的值: d结点的值为d欲改变此结点的值,请输入新值: m层序遍历二叉树:a b c m e f gm的双亲是bm的左孩子是gm没有右孩子m没有左兄弟m的右兄弟是e构造一个右子树为空的二叉树c:请先序输入二叉树(如:ab三个空格表示a为根结点,b为左子树的二叉树)hijl   k先序递归遍历二叉树c:h i j l k树c插到树T中,请输入树T中树c的双亲结点 c为左(0)或右(1)子树: b 1先序递归遍历二叉树:a b m g h i j l k e c f删除子树,请输入待删除子树的双亲结点  左(0)或右(1)子树: h 0e1 = h, i = 0先序递归遍历二叉树:a b m g h e c f请按任意键继续. . .





1 0
原创粉丝点击