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 }