交换二叉树的左右子树——非递归方式
这是华为的一道机试题,其实并不难,不让用递归可以用栈来解决,具体的代码如下:
#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
交换二叉树的左右子树——非递归方式相关推荐
- 二叉树的遍历(非递归方式)
前序非递归遍历(借用栈结构): ①将根节点入栈: ②判栈空,获取栈顶元素输出: ③判断右子树是否为空,再判断左子树是否为空,在回至②执行. void PreOrder(BinTree bt) {sta ...
- 二叉树 —— 创建二叉树 先序遍历 、中序遍历、后序遍历(递归方式、非递归方式)
#include<stdio.h> #include<malloc.h> #include<stdlib.h> typedef char DataType; #de ...
- 分别用递归和非递归方式实现二叉树先序、中序和后序遍历(java实现)
分别用递归和非递归方式实现二叉树先序.中序和后序遍历 用递归和非递归方式,分别按照二叉树先序.中序和后序打印所有的节点.我们约定:先序遍历顺序 为根.左.右;中序遍历顺序为左.根.右;后序遍历顺序为左 ...
- 算法练习day10——190328(二叉树的先序、 中序、 后序遍历, 包括递归方式和非递归方式、找到一个节点的后继节点、二叉树的序列化和反序列化)
1.实现二叉树的先序. 中序. 后序遍历, 包括递归方式和非递归方式 1.1 访问节点的顺序 节点访问顺序如下图所示: 访问顺序:1 2 4 4 4 2 5 5 5 2 1 3 6 6 6 3 7 7 ...
- 左神算法:分别用递归和非递归方式实现二叉树先序、中序和后序遍历(Java版)
本题来自左神<程序员代码面试指南>"分别用递归和非递归方式实现二叉树先序.中序和后序遍历"题目. 题目 用递归和非递归方式,分别按照二叉树先序.中序和后序打印所有的节点 ...
- 中序遍历二叉树-非递归方式实现-附C++代码
一.问题描述 给定一个二叉树,要求以非递归的方式进行中序遍历. 原题:二叉树的中序遍历 - leetcode 二.解题思路 首先需要知道一些前置知识:中序遍历是指按 左子树 -> 根节点 -&g ...
- golang二叉树的递归和非递归方式的前中后序遍历
二叉树的递归和非递归方式中序遍历 方法一:递归 思路与算法 首先我们需要了解什么是二叉树的中序遍历:按照访问左子树--根节点--右子树的方式遍历这棵树() (前序和后序遍历方式一样,就是打印root节 ...
- 分别采用递归和非递归方式编写两个函数,求一棵二叉树中叶子节点个数
分别采用递归和非递归方式编写两个函数,求一棵二叉树中叶子节点个数 #include #include #define MAXSIZE 50 typedef char datatype; typedef ...
- 实现二叉树的三种非递归遍历算法
[问题描述] 编写程序,实现二叉树的三种非递归遍历算法:先序非递归,中序非递归,后序非递归. [输入形式] 输入建树序列. [输出形式] 输出三种遍历序列. [样例输入] A B C # # # # ...
最新文章
- Can’t connect to local MySQL server through socket的解决方法
- flume ng之组件介绍
- 循环链表应用——约瑟夫置换
- 岗位推荐 | 蚂蚁金服招聘机器学习、自然语言处理算法工程师
- PostgreSQL 9.6 keepalived主从部署
- 程序员做到年薪60万也不去炫富,背后原因曝光,麻烦做个人吧
- 前端 鼠标一次移动半个像素_小猿圈分享2019年前端JavaScript面试题(三)
- 问答| 四轮驱动移动机器人(SSMR)简化模型的虚拟轮间距dLR具体是多少
- vue2.0+ajax封装,vue2 封装 ajax插件
- iOS开发那些事--nib、xib与故事板的关系
- html遮罩水印,CSS滤镜遮罩,图片水印效果
- kaggle TMDB5000电影数据分析和电影推荐模型数据分析相关函数解释参考文章:
- 基础物理-物质的组成
- 督查督办管理系统在企业管理中起到的作用
- 通过canvas画出爱心图案,表达你的爱意!
- (附源码)计算机毕业设计ssm高校请假管理系统
- 首批学习Java的人,如今怎么样了?
- OA系统请假,出差等流程审批解析
- 计算机组成与系统结构实验-基于微程序控制的CPU设计
- matlab消除泊松噪声,基于自适应噪声方差估计的去除泊松噪声的算法.PDF