实验内容:
- 创建二叉树;
- 输出二叉树b;
- 输出’H’结点的左、右孩子结点值;
- 输出二叉树b的高度;
- 释放二叉树b。
#include<iostream> #include<malloc.h> #define Maxsize 100 using namespace std; typedef char ElemType; typedef struct node { ElemType data; struct node *lchild; struct node *rchild; }BTNode; //创建二叉树 void CreateBTree(BTNode *&b,const char *str) { BTNode *St[Maxsize],*p; int top=-1,k,j=0; char ch; b=NULL; ch=str[j]; while(ch!='\0') { switch(ch) { case '(':top++;St[top]=p;k=1;break; case ')':top--;break; case ',':k=2;break; default:p=(BTNode *)malloc(sizeof(BTNode)); p->data=ch; p->lchild=p->rchild=NULL; if(b==NULL) b=p; else { switch(k) { case 1:St[top]->lchild=p;break; case 2:St[top]->rchild=p;break; } } } j++; ch=str[j]; } } //输出二叉树 void DispBTree(BTNode *b) { if(b!=NULL) { cout<<b->data; if(b->lchild!=NULL || b->rchild!=NULL) { cout<<"("; DispBTree(b->lchild); if(b->rchild!=NULL) cout<<","; DispBTree(b->rchild); cout<<")"; } } } //查找节点 BTNode *FindNode(BTNode *b,ElemType x) { BTNode *p; if(b==NULL) return NULL; else if(b->data==x) return b; else { p=FindNode(b->lchild,x); if(p!=NULL) return p; else return FindNode(b->rchild,x); } } //查找孩子节点 BTNode *LchildNode(BTNode *p) { return p->lchild; } BTNode *RchildNode(BTNode *p) { return p->rchild; } //求二叉树高度 int BTHeight(BTNode *b) { int lchildh,rchildh; if(b==NULL) return(0); else { lchildh=BTHeight(b->lchild); rchildh=BTHeight(b->rchild); return (lchildh>rchildh)?(lchildh+1):(rchildh+1); } } //销毁二叉树 void DestroyBTree(BTNode *&b) { if(b!=NULL) { DestroyBTree(b->lchild); DestroyBTree(b->rchild); free(b); } } //主函数 int main() { BTNode *b,*p,*lp,*rp; cout<<"创建二叉树:"<<endl; CreateBTree(b,"A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I)))"); cout<<"输出二叉树:"; DispBTree(b); cout<<endl; cout<<"H节点:"; p=FindNode(b,'H'); if(p!=NULL) { lp=LchildNode(p); if(lp!=NULL) cout<<"左孩子:"<<lp->data; else cout<<"无左孩子"; rp=RchildNode(p); if(rp!=NULL) cout<<"右孩子:"<<rp->data; else cout<<"无右孩子"; } cout<<endl; cout<<"二叉树b的高度:"<<BTHeight(b); cout<<"释放二叉树"; DestroyBTree(b); return 0; }