二叉樹各種基本運算的演算法
阿新 • • 發佈:2019-01-31
【程式碼】//檔名:btree.cpp
#include <stdio.h> #include <malloc.h> #define MaxSize 100 typedef char ElemType; typedef struct node { ElemType data; //資料元素 struct node *lchild; //指向左孩子節點 struct node *rchild; //指向右孩子節點 } BTNode; void CreateBTree(BTNode *&b,char *str) //建立二叉樹 { BTNode *St[MaxSize],*p=NULL; int top=-1,k,j=0; char ch; b=NULL; //建立的二叉樹初始時為空 ch=str[j]; while(ch!='\0') //str未掃描完時迴圈 { 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) //*p為二叉樹的根節點 b=p; else //已建立二叉樹根節點 switch(k) { case 1: St[top]->lchild=p; break; case 2: St[top]->rchild=p; break; } } j++; ch=str[j]; } } void DestroyBTree(BTNode *&b) //銷燬二叉樹 { if(b!=NULL) { DestroyBTree(b->lchild); DestroyBTree(b->rchild); free(b); } } BTNode *FindNode(BTNode *b,ElemType x) //查詢值為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) //返回p結點的左孩子結點指標 { return p->lchild; } BTNode *RchildNode(BTNode *p) //返回p結點的右孩子指標 { return p->rchild; } int BTHeight(BTNode *b) //求二叉樹的高度 { int lchildh,rchildh; if(b==NULL) return(0); //空樹的高度為0 else { lchildh=BTHeight(b->lchild); //求左子樹的高度為lchildh rchildh=BTHeight(b->rchild); //求右子樹的高度為rchildh return (lchildh>rchildh)?(lchildh+1):(rchildh+1); } } void DispBTree(BTNode *b) //以括號表示法輸出二叉樹 { if(b!=NULL) { printf("%c",b->data); if(b->lchild!=NULL||b->rchild!=NULL) { printf("("); //有孩子節點時才輸出( DispBTree(b->lchild); //遞迴處理左子樹 if(b->rchild!=NULL) printf(","); //有右孩子節點時才輸出, DispBTree(b->rchild); //遞迴處理右子樹 printf(")"); //有孩子節點時才輸出) } } }