刪除以某個節點為根節點的子樹
阿新 • • 發佈:2018-12-30
編寫一個程式,假設二叉樹中節點值為單個字元,且均不相同,採用二叉鏈儲存,設計遞迴演算法求值為x的子樹並刪除該子樹,給出刪除以節點D為子樹的結果。
程式碼:
#include <stdio.h> #include <malloc.h> typedef char ElemType; typedef struct Node { ElemType data; Node *Lchild,*Rchild; } BiTNode,*BiTree; BiTree CreateBiTree();//建立二叉樹 BiTNode *Find(BiTree T,char x); int PostTreeDepth(BiTree T);//後序遍歷二叉樹高度 void PreOrder(BiTree T);//先序 void Destory(BiTree T); void Delete(BiTree T,char x); int main(void) { char x; BiTree root=CreateBiTree(); getchar(); printf("該樹的先序遍歷為:\n"); PreOrder(root);//先序 printf("\n"); printf("該樹的高度為:%d\n",PostTreeDepth(root)); printf("請輸入要刪除的節點\n"); scanf("%c",&x); Delete(root,x); printf("刪除以節點%c子樹後該樹的先序遍歷為:\n",x); PreOrder(root); printf("\n"); printf("刪除以節點%c子樹後該樹的高度為:%d\n",x,PostTreeDepth(root)); return 0; } BiTree CreateBiTree()//建立二叉樹 { ElemType x; BiTree T; scanf("%c",&x); if(x=='#') T=NULL; else { T=(BiTree)malloc(sizeof(BiTNode)); T->data=x; T->Lchild=CreateBiTree(); T->Rchild=CreateBiTree(); } return T; } BiTNode *Find(BiTree T,char x) { BiTNode *p; if(T==NULL) return NULL; else if(T->data==x) return T; else if(T->Lchild!=NULL&&T->Lchild->data==x) { p=T->Lchild; T->Lchild=NULL; return p; } else if(T->Rchild!=NULL&&T->Rchild->data==x) { p=T->Rchild; T->Rchild=NULL; return p; } else { p=Find(T->Lchild,x); if(p!=NULL) return p; else return Find(T->Rchild,x); } } int PostTreeDepth(BiTree T)//後序遍歷二叉樹高度 { int hl,hr,max; if(T!=NULL) { hl=PostTreeDepth(T->Lchild); hr=PostTreeDepth(T->Rchild); max=hl>hr?hl:hr; return max+1; } else return 0; } void PreOrder(BiTree T)//先序 { if(T!=NULL) { printf("%c ",T->data); PreOrder(T->Lchild); PreOrder(T->Rchild); } } void Destory(BiTree T) { if(T!=NULL) { Destory(T->Lchild); Destory(T->Rchild); free(T); } } void Delete(BiTree T,char x) { BiTNode *p=Find(T,x); if(p!=NULL) Destory(p); }