题目1503:二叉搜索树与双向链表

题目描述:

输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。

输入:

输入可能包含多个测试样例。
对于每个测试案例,输入的第一行为一个数n(0<n<1000),代表测试样例的个数。
接下来的n行,每行为一个二叉搜索树的先序遍历序列,其中左右子树若为空则用0代替。

输出:

对应每个测试案例,
输出将二叉搜索树转换成排序的双向链表后,从链表头至链表尾的遍历结果。

样例输入:
1
2 1 0 0 3 0 0
样例输出:
1 2 3
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;

int a[1000],cnt;

struct Node
{
	int x;
	struct Node *left;
	struct Node *right;
};

void createTree(Node *&root){
	int x;
	scanf("%d",&x);
	if(!x)
		root = NULL;
	else{
		root = new Node;
		root->x = x;
		createTree(root->left);
		createTree(root->right);
	}
}


void convert(Node *root,Node *&last){
	if(root == NULL)
		return;
	Node *p = root;
	if(p->left != NULL){
		convert(p->left,last);
	}
	p->left = last;
	if(last != NULL)
		last->right = p;
	last = p;
	if(p->right != NULL)
		convert(p->right,last);
}

int main(int argc, char const *argv[])
{
	int n;
	while(scanf("%d",&n) != EOF){
		while(n--){
			Node *root,*head,*last,*p;
			last = NULL;
			createTree(root);
			convert(root,last);
			head = last;
			while(head != NULL && head->left != NULL)
				head = head->left;
			p = head;
			while(p){
				printf("%d ",p->x);
				p = p->right;
			}
			printf("
");
		}
	}
	return 1;
}


原文地址:https://www.cnblogs.com/jiangu66/p/3170370.html