这是华为的一道机试题,其实并不难,不让用递归可以用栈来解决,具体的代码如下:

#include <stdio.h>
#include <stdlib.h>struct node{char data ;struct node* left ;struct node* right ;
};struct tree{struct node* root ;
};void tree_create( struct node** node){char data;scanf("%c" , &data);if(data == '#' ){*node = NULL;}else{*node = ( struct node*)malloc(sizeof( struct node));(*node)-> data = data;tree_create(&(*node)-> left);tree_create(&(*node)-> right);}
}void tree_destory( struct node** node){if(*node != NULL){tree_destory(&(*node)-> left);tree_destory(&(*node)-> right);free(node);}
}void tree_first( struct node* node){if(node == NULL)return;printf("%c " , node->data);tree_first(node-> left);tree_first(node-> right);
}static struct node* stack[5] = {0};
static int pos = -1;void push( struct node* node){stack[++pos] = node;
}void pop(){--pos;
}int empty(){return pos == -1;
}struct node* top(){return stack[pos];
}void exchange( struct node* node){struct node* tnode = node;struct node* tmp = NULL;if(node == NULL)return;while(1){tmp = tnode-> left;tnode-> left = tnode->right ;tnode-> right = tmp;if(tnode->right ){push(tnode-> right);}if(tnode->left ){tnode = tnode->left;}else{if(!empty()){tnode = top();pop();}else{break;}}}
}int main(){struct tree tree;tree_create(&tree. root);printf("交换前的先序遍历:" );tree_first(tree. root);printf("\n" );exchange(tree. root);printf("交换后的先序遍历:" );tree_first(tree. root);printf("\n" );tree_destory(&tree. root);return 0;
}

本文链接:http://blog.csdn.net/girlkoo/article/details/17605349

本文作者:girlkoo

交换二叉树的左右子树——非递归方式相关推荐

  1. 二叉树的遍历(非递归方式)

    前序非递归遍历(借用栈结构): ①将根节点入栈: ②判栈空,获取栈顶元素输出: ③判断右子树是否为空,再判断左子树是否为空,在回至②执行. void PreOrder(BinTree bt) {sta ...

  2. 二叉树 —— 创建二叉树 先序遍历 、中序遍历、后序遍历(递归方式、非递归方式)

    #include<stdio.h> #include<malloc.h> #include<stdlib.h> typedef char DataType; #de ...

  3. 分别用递归和非递归方式实现二叉树先序、中序和后序遍历(java实现)

    分别用递归和非递归方式实现二叉树先序.中序和后序遍历 用递归和非递归方式,分别按照二叉树先序.中序和后序打印所有的节点.我们约定:先序遍历顺序 为根.左.右;中序遍历顺序为左.根.右;后序遍历顺序为左 ...

  4. 算法练习day10——190328(二叉树的先序、 中序、 后序遍历, 包括递归方式和非递归方式、找到一个节点的后继节点、二叉树的序列化和反序列化)

    1.实现二叉树的先序. 中序. 后序遍历, 包括递归方式和非递归方式 1.1 访问节点的顺序 节点访问顺序如下图所示: 访问顺序:1 2 4 4 4 2 5 5 5 2 1 3 6 6 6 3 7 7 ...

  5. 左神算法:分别用递归和非递归方式实现二叉树先序、中序和后序遍历(Java版)

    本题来自左神<程序员代码面试指南>"分别用递归和非递归方式实现二叉树先序.中序和后序遍历"题目. 题目 用递归和非递归方式,分别按照二叉树先序.中序和后序打印所有的节点 ...

  6. 中序遍历二叉树-非递归方式实现-附C++代码

    一.问题描述 给定一个二叉树,要求以非递归的方式进行中序遍历. 原题:二叉树的中序遍历 - leetcode 二.解题思路 首先需要知道一些前置知识:中序遍历是指按 左子树 -> 根节点 -&g ...

  7. golang二叉树的递归和非递归方式的前中后序遍历

    二叉树的递归和非递归方式中序遍历 方法一:递归 思路与算法 首先我们需要了解什么是二叉树的中序遍历:按照访问左子树--根节点--右子树的方式遍历这棵树() (前序和后序遍历方式一样,就是打印root节 ...

  8. 分别采用递归和非递归方式编写两个函数,求一棵二叉树中叶子节点个数

    分别采用递归和非递归方式编写两个函数,求一棵二叉树中叶子节点个数 #include #include #define MAXSIZE 50 typedef char datatype; typedef ...

  9. 实现二叉树的三种非递归遍历算法

    [问题描述] 编写程序,实现二叉树的三种非递归遍历算法:先序非递归,中序非递归,后序非递归. [输入形式] 输入建树序列. [输出形式] 输出三种遍历序列. [样例输入] A B C # # # # ...

最新文章

  1. Can’t connect to local MySQL server through socket的解决方法
  2. flume ng之组件介绍
  3. 循环链表应用——约瑟夫置换
  4. 岗位推荐 | 蚂蚁金服招聘机器学习、自然语言处理算法工程师
  5. PostgreSQL 9.6 keepalived主从部署
  6. 程序员做到年薪60万也不去炫富,背后原因曝光,麻烦做个人吧
  7. 前端 鼠标一次移动半个像素_小猿圈分享2019年前端JavaScript面试题(三)
  8. 问答| 四轮驱动移动机器人(SSMR)简化模型的虚拟轮间距dLR具体是多少
  9. vue2.0+ajax封装,vue2 封装 ajax插件
  10. iOS开发那些事--nib、xib与故事板的关系
  11. html遮罩水印,CSS滤镜遮罩,图片水印效果
  12. kaggle TMDB5000电影数据分析和电影推荐模型数据分析相关函数解释参考文章:
  13. 基础物理-物质的组成
  14. 督查督办管理系统在企业管理中起到的作用
  15. 通过canvas画出爱心图案,表达你的爱意!
  16. (附源码)计算机毕业设计ssm高校请假管理系统
  17. 首批学习Java的人,如今怎么样了?
  18. OA系统请假,出差等流程审批解析
  19. 计算机组成与系统结构实验-基于微程序控制的CPU设计
  20. matlab消除泊松噪声,基于自适应噪声方差估计的去除泊松噪声的算法.PDF

热门文章

  1. 自己无聊做的一个简单的企业进销存管理系统
  2. 电脑的学名为电子计算机
  3. 阿里云国际版如何将ECS云服务器中的数据备份到本地
  4. 行通信比并行通信的速度更高
  5. 一名普通医护人员的抗疫日志
  6. java 奶牛生子,奶牛镇的小时光npc怎么结婚?结婚生子攻略
  7. mysqli_fetch_assoc()和mysqli_fetch_array()的区别与用法
  8. mapbox-gl开发:带高度的标签
  9. python 爬虫 网易云音乐 抓取
  10. VS Code快速实现Git PR操作