题目1503:二叉搜索树与双向链表
2015-06-02 21:36
447 查看
时间限制:1 秒内存限制:128 兆题目描述:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。输入:输入可能包含多个测试样例。对于每个测试案例,输入的第一行为一个数n(0<n<1000),代表测试样例的个数。接下来的n行,每行为一个二叉搜索树的先序遍历序列,其中左右子树若为空则用0代替。输出:对应每个测试案例,输出将二叉搜索树转换成排序的双向链表后,从链表头至链表尾的遍历结果。样例输入:
1 2 1 0 0 3 0 0样例输出:
1 2 3
解题感悟:这个题目让我感觉很烦, 首先需要建树,其次根据树使用中序遍历。
#include <iostream>#include <cstdio>#include <stack>using namespace std;struct Node{int val;Node *left, *right;Node(int _val) : val(_val), left(NULL), right(NULL){}};stack<Node *> st;int main(void){int n;scanf("%d", &n);for (int i = 0; i < n; ++i){Node *head = NULL, *top, *node;int val;bool flag = true;scanf("%d", &val);if (val == 0)continue;head = new Node(val);st.push(head);while (!st.empty()){scanf("%d", &val);if (val){node = new Node(val);if (flag){st.top() -> left = node;st.push(node);}else{st.top() -> right = node;st.push(node);flag = true;}}else{if (flag){flag = false;}else{top = st.top();st.pop();while (!st.empty() && st.top() -> right == top){top = st.top();st.pop();}}}}Node dummy(-1);Node *pre = &dummy;while (!st.empty() || head){while (head){st.push(head);head = head -> left;}top = st.top();st.pop();top -> left = pre;pre -> right = top;pre = top;head = top -> right;}head = dummy.right;//printf("%d", head -> val);//head = head -> right;while (head){printf("%d ", head -> val);head = head -> right;}printf("\n");}return 0;}[/code]
相关文章推荐
- poj2594 (最小路径覆盖 + floyd)
- webservice跨域文件,好多年前的东西,远程调用,js服务器端使用,可以远程调用
- JavaScript读书笔记(1)
- 百度之夜分享移动搜索优化策略
- Hibernate HelloWorld-11 HQL 检索方式
- 理解Java ClassLoader机制(转载)
- CPU五级流水线工程(带Hazard)
- klg2
- HDU 3038 How Many Answers Are Wrong 带权并查集
- Linux 系统内核空间与用户空间通信的实现与分析
- Hamming Problem(丑数)
- linux程序设计——shell程序设计(第二章)
- 线程初级知识点
- [转] 从最大似然到EM算法浅解
- 物理结构 逻辑结构
- 实验8,编写一个模板函数求数组中的最大值和最小值
- java装饰模式和适配器模式区别
- python读写文件
- Powerdesigner15-用jdbc链接MySQL实现逆向工程步骤
- 一切成功源于积累——20150602 欧美 1700点 半小时