二叉樹左右交換:若二叉樹左孩子的值大於右孩子的值則交換左右孩子
阿新 • • 發佈:2020-11-23
1 //問題:若二叉樹左孩子的值大於右孩子的值則交換左右孩子 2 //思路:可以用遍歷的思想解決問題。採用後序遍歷方法,目的是從下到上,從子到雙親進行交換 3 #include "stdio.h" 4 #include "stdlib.h" 5 typedef struct TNode{ //樹節點 6 char data; 7 TNode *lchild,*rchild; 8 }TNode; 9 typedef struct LNode{ //棧節點 10 char data; 11 LNode *next; 12 }LNode; 13 14 voidpush(LNode *&l,char data){ //入棧 15 LNode *p = (LNode*)malloc(sizeof(LNode)); 16 p->data = data; 17 p->next = l->next; 18 l->next = p; 19 } 20 char pop(LNode *&l){ //出棧 21 LNode *p = l->next; 22 char tmp = p->data; 23 l->next = p->next; 24 free(p); 25 return tmp; 26 } 27 28 TNode *CreateTree(LNode *&l){ //先序遍歷建立二叉樹,引數為資料棧l 29 if(l->next->data=='*'){ //假如當前首字元為*,那就說明該節點為NULL,返回上一層的createTree函式,並執行上一層函式未執行完的語句 30 pop(l); //拋掉棧頂元素 31 return NULL; 32 } 33 TNode *p = (TNode*)malloc(sizeof(TNode)); //申請新節點34 p->data = pop(l); //棧頂元素入樹 35 p->lchild = CreateTree(l); //將下一個樹節點連結到當前節點的左子樹上 36 p->rchild = CreateTree(l); 37 return p; //當執行到這個語句的時候,說明樹的建立已經完成了。把根節點返回 38 } 39 void preOrder(TNode *t){ //先序遍歷 40 if(t!=NULL){ 41 printf("%d ",t->data); 42 preOrder(t->lchild); 43 preOrder(t->rchild); 44 } 45 } 46 void InOrder(TNode *t){ //中序遍歷 47 if(t!=NULL){ 48 InOrder(t->lchild); 49 printf("%d ",t->data); 50 InOrder(t->rchild); 51 } 52 } 53 void postOrder(TNode *t){ //後序遍歷 54 if(t!=NULL){ 55 InOrder(t->lchild); 56 InOrder(t->rchild); 57 printf("%d ",t->data); 58 } 59 } 60 //*********核心程式碼*********************************************** 61 void exchange(TNode *&t){ //交換 62 if(t!=NULL){ 63 exchange(t->lchild); 64 exchange(t->rchild); 65 if(t->lchild!=NULL&&t->rchild!=NULL&&t->lchild->data > t->rchild->data){ 66 TNode *tmp = t->lchild; 67 t->lchild = t->rchild; 68 t->rchild = tmp; 69 } 70 } 71 } 72 //*********核心程式碼*********************************************** 73 74 int main(){ 75 char str[] = {1,3,7,'*','*',6,8,'*',10,'*','*',9,'*','*','*'}; //*表示空 76 LNode *s = (LNode*)malloc(sizeof(LNode)); 77 s->next = NULL; 78 for(int i=15;i>=0;i--) push(s,str[i]); //將樹資料入棧 79 TNode *t = CreateTree(s); //建樹 80 exchange(t); //交換 81 InOrder(t); 82 getchar(); 83 return 0; 84 }