您的位置:首页 > 其它

题目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]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: