#include<bits/stdc++.h>usingnamespace std;#defineTElemTypechar#defineStatusint//------------二叉树的二叉链表存储表示-------------typedefstructBiTNode{
TElemType data;structBiTNode*lchild,*rchild;//左右孩子指针} BiTNode,*BiTree;//------------基本操作的函数原型说明---------------
Status InitBiTree(BiTree &T);
Status DestroyBiTree(BiTree &T);
Status CreateBiTree(BiTree &T);voidClearBiTree(BiTree &T);
Status BiTreeEmpty(BiTree T);intBiTreeDepth(BiTree T);
Status Root(BiTree T);
Status Value(BiTree T, TElemType e);
Status Assign(BiTree &T, TElemType e, TElemType value);
Status Parent(BiTree T, TElemType e);
Status LeftChild(BiTree T, TElemType e);
Status RightChild(BiTree T, TElemType e);
Status LeftSibling(BiTree T, TElemType e);
Status RightSibling(BiTree T, TElemType e);
Status InsertChild(BiTree T, BiTree p,int LR, BiTree c);
Status DeleteChild(BiTree T, BiTree p,int LR);//-----------------具体实现-----------------------
Status InitBiTree(BiTree &T){
T =NULL;return1;}
Status DestroyBiTree(BiTree &T){if((T)->lchild)DestroyBiTree(T->lchild);if((T)->rchild)DestroyBiTree(T->rchild);free(T);
T =NULL;return1;}
Status CreateBiTree(BiTree &T){//算法6.4
TElemType ch;scanf("%c",&ch);if(ch ==' ')
T =NULL;else{
T =(BiTree)malloc(sizeof(BiTNode));if(!T)exit(_OVERFLOW);
T->data = ch;CreateBiTree(T->lchild);CreateBiTree(T->rchild);}return1;}voidClearBiTree(BiTree &T){if(T){if((T)->lchild)ClearBiTree(T->lchild);if((T)->rchild)ClearBiTree(T->rchild);free(T);
T =NULL;}}
Status BiTreeEmpty(BiTree T){if(T)return0;elsereturn1;}intBiTreeDepth(BiTree T){int i, j;if(!T)return0;if(T->lchild)
i =BiTreeDepth(T->lchild);else
i =0;if(T->rchild)
j =BiTreeDepth(T->rchild);else
j =0;return i > j ? i +1: j +1;}
Status Root(BiTree T){
cout << T->data << endl;return1;}
Status Value(BiTree T,TElemType e){if(T->data==e)return1;else{int i =0, j =0;if(T->lchild)
i =Value(T->lchild, e);if(T->rchild)
j =Value(T->rchild, e);if(i||j)return1;elsereturn0;}return0;}
Status Assign(BiTree &T,TElemType e,TElemType value){if(T->data==e){
T->data = value;return1;}else{int i=0,j=0;if(T->lchild){
i =Assign(T->lchild, e, value);}if(T->rchild){
j=Assign(T->rchild,e,value);}if(i||j)return1;elsereturn0;}return0;}
Status Parent(BiTree T,TElemType e){if(T->lchild&&T->lchild->data==e){printf("双亲节点为:%c\n",T->data);return1;}elseif(T->rchild&&T->rchild->data==e){printf("双亲节点为:%c\n",T->data);return1;}else{if(T->lchild){Parent(T->lchild,e);}if(T->rchild){Parent(T->rchild,e);}}return0;}
Status LeftChild(BiTree T,TElemType e){if(T->data==e&&T->lchild){printf("左孩子节点为:%c\n",T->lchild->data);return1;}else{if(T->lchild){LeftChild(T->lchild,e);}if(T->rchild){LeftChild(T->rchild,e);}}return0;}
Status RightChild(BiTree T,TElemType e){if(T->data==e&&T->rchild){printf("右孩子节点为:%c\n",T->rchild->data);return1;}else{if(T->lchild){RightChild(T->lchild,e);}if(T->rchild){RightChild(T->rchild,e);}}return0;}
Status LeftSibling(BiTree T,TElemType e){if(T->lchild&&T->rchild->data==e){printf("左兄弟节点为:%c\n",T->lchild->data);return1;}else{if(T->lchild){LeftSibling(T->lchild,e);}if(T->rchild){LeftSibling(T->rchild,e);}}return0;}
Status RightSibling(BiTree T,TElemType e){if(T->rchild&&T->lchild->data==e){printf("左兄弟节点为:%c\n",T->rchild->data);return1;}else{if(T->lchild){RightSibling(T->lchild,e);}if(T->rchild){RightSibling(T->rchild,e);}}return0;}
Status InsertChild(BiTree T,BiTree p,int LR,BiTree c){if(LR==0){//c的右子树为空,使p的左子树成为c的右子树,并使增加了右子树的c成为p的左子树
c->rchild=p->lchild;
p->lchild=c;}else{//c的右子树为空,使p的右子树成为c的右子树,并使增加了右子树的c成为p的右子树
c->rchild=p->rchild;
p->rchild=c;}return1;}
Status DeleteChild(BiTree T,BiTree p,int LR){if(LR==0){//删除p的左子树 DestroyBiTree(p->lchild);}else{//删除p的右子树 DestroyBiTree(p->rchild);}return1;}