-
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
时间限制: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; }