#include<stdio.h> #include<stdlib.h> typedef char TElemType; typedef struct node{ TElemType data; //结点数据 struct node *lchild,*rchild; //左右子女指针 }BinTNode, *BinTree; //二叉树定义 //创建二叉树 void createBinTree_Pre(BinTNode *&T,TElemType pre[],int &n){ TElemType ch = pre[n++]; if(ch == ';') return; if(ch != '#'){ T = (BinTNode*) malloc (sizeof(BinTNode)); //递归根节点 T->data=ch; createBinTree_Pre(T->lchild,pre,n); //递归建立左子树 createBinTree_Pre(T->rchild,pre,n); //递归建立右子树 }else T = NULL; //否则建立空子树 }; //以广义表的形式输出二叉树 void PrintBinTree (BinTNode *T){ if(T!=NULL){ printf("%c",T->data); if(T->lchild!=NULL||T->rchild!=NULL){ printf("("); PrintBinTree(T->lchild); printf(","); PrintBinTree(T->rchild); printf(")"); } } } //二叉树的总结点数 int Nodenum(BinTNode *T){ if(T == NULL){ return 0; }else{ return 1+Nodenum(T->lchild)+Nodenum(T->rchild); } } //计算二叉树的高度 int Height(BinTNode *T){ if(T==NULL) return 0; //递归结束;空树高度为0 else{ int i= Height(T->lchild); int j= Height(T->rchild); return (i<j)?j+1:i+1; } } //二叉树的叶子结点数 int Leafnum (BinTNode *T){ if(!T){ return 0; }else if((T->lchild == NULL)&&(T->rchild == NULL)){ return 1; }else { return (Leafnum (T->lchild)+Leafnum (T->rchild)); } } //输入结点找双亲结点 BinTNode *getParent (BinTNode *T,TElemType key){ if((T->lchild!=NULL&&T->lchild->data==key)||(T->rchild!=NULL)&&T->rchild->data==key){ return T; }else { getParent(T->lchild,key); getParent(T->rchild,key); } return NULL; } //输入结点找左孩子和右孩子结点 BinTNode *getNodenum(BinTNode *T,TElemType key){ if(T != NULL&&T->data == key){ return T; }else { getNodenum (T->lchild,key); getNodenum (T->rchild,key); } return NULL; } main(){ BinTree T; BinTree Parent,leftChild,rightChild; char key; BinTree Temp; char a[100]={'A','B','C','#','#','D','E','#','#','#','F','#','#',';'}; int i=0; createBinTree_Pre(T,a,i); printf("二叉树用广义表表示为:"); PrintBinTree(T); printf(" 二叉树的高度为:%d",Height(T)); printf(" 二叉树的总结点为:%d",Nodenum(T)); printf(" 二叉树的叶子结点为:%d",Leafnum(T)); printf(" 请输入需要查找的双亲结点的结点:"); scanf("%c",&key); getchar(); Parent = getParent(T,key); printf("输入的节点的双亲点的数据是:%c ",Parent->data); printf("请输入需要查找左右孩子结点的结点:"); scanf("%c",&key); getchar(); Temp = getNodenum(T,key); leftChild = Temp->lchild; rightChild = Temp->rchild; printf("您输入的节点的左孩子节点数据是:%c ",leftChild->data); printf("您输入的节点的右孩子节点数据是:%c ",rightChild->data); }