zoukankan      html  css  js  c++  java
  • 二叉树左右交换:若二叉树左孩子的值大于右孩子的值则交换左右孩子

     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 }
  • 相关阅读:
    数据库事务4种隔离级别及7种传播行为
    Spring AOP深入剖析
    SQL语句-创建索引
    global文件中的application_start方法中做: 定时器
    细说ASP.NET Forms身份认证
    asp.net(C#)实现功能强大的时间日期处理类完整实例
    C# 文件操作类大全
    SQL Server Profiler:使用方法和指标说明
    分库分表原则 总结
    做软件与团队建设——对带研发团队和管理的总结
  • 原文地址:https://www.cnblogs.com/BreezeFeng/p/14026937.html
Copyright © 2011-2022 走看看