二叉树左右交换:若二叉树左孩子的值大于右孩子的值则交换左右孩子

 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 }

 

posted @ 2020-11-23 20:46  封不烦  阅读(734)  评论(0编辑  收藏  举报