二叉树左右交换:若二叉树左孩子的值大于右孩子的值则交换左右孩子
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 void push(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 }