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


     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 }
  • 相关阅读:
    单位根反演
    安卓第十三天笔记-服务(Service)
    安卓第十二天笔记-广播
    安卓第十一天笔记-Intent与inter-filter配置
    安卓第十天笔记-fragment
    安卓第九天笔记-Activity
    安卓第八天笔记--网络编程二
    安卓第七天笔记--网络编程一
    安卓第六天笔记--ListView
    安卓第五天笔记-对话框
  • 原文地址:https://www.cnblogs.com/BreezeFeng/p/14026937.html
Copyright © 2020-2023  润新知