二叉查找树转双向链表(笔试)

输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。
要求不能创建任何新的结点,只能调整指针的指向
   
                 10
                 / \
               6   14
              / \   / \
           4    8 12 16
   

 转换后成双向链表4<>6<>8<>10<>12<>14<>16。

#include <iostream>
#include <cstdio>
#include <string>
using namespace std;
struct Tree {
	int data;
	Tree *left;
	Tree *right;
	Tree(int d, Tree *l , Tree *r): data(d),left(l),right(r){}
};
Tree *MakeTree(int mydata) {
	return new Tree(mydata,NULL, NULL);
}
void InsertTree(int mydata, Tree *&t) {
	if(t == NULL) {
		t = new Tree(mydata, NULL, NULL);
	}
	else if(mydata >= t->data){
		InsertTree(mydata, t->right);
	}else if(mydata < t->data)
		InsertTree(mydata, t->left);
	else{}
}
Tree *treeRoot, *tmp;
void visit(Tree *t) {
	if(t == NULL)
		return;
	visit(t->left);

	if(treeRoot == NULL) {
		treeRoot = t;
		tmp = treeRoot;
		treeRoot->left = NULL;
		treeRoot->right = NULL;
	}
	else {
		tmp->right = t;
		t->left = tmp;
		tmp = tmp->right;
	}
	visit(t->right);
}
void MakeList(Tree *t) {
	treeRoot = NULL;
	visit(t);
	for(; treeRoot != NULL; treeRoot = treeRoot->right) {
		cout<<treeRoot->data<<" |  ";
	}
	cout<<endl;
}
void DeleteTree(Tree *root) {
	if(root == NULL)
		return;
	DeleteTree(root->left);
	DeleteTree(root->right);
	delete root;
	root = NULL;
}
int main() {
	//Tree *root;
	int n, a;
	cin>>n;
	cin>>a;
	treeRoot = MakeTree(a);
	for(int i = 1; i<n; i++) {
		cin >>a;
		InsertTree(a,treeRoot);
	}
	MakeList(treeRoot);
	system("pause");
}

另外一个题目:二叉查找树转双向链表,不需要在原树上操作。

#include <iostream>
#include <cstdio>
#include <string>
using namespace std;
struct List {
	int data;
	List *prev;
	List *next;
	List(int d, List *p ,List *n):data(d), prev(p), next(n) {}
};
struct Tree {
	int data;
	Tree *left;
	Tree *right;
	Tree(int d, Tree *l , Tree *r): data(d),left(l),right(r){}
};
Tree *MakeTree(int mydata) {
	return new Tree(mydata,NULL, NULL);
}
void InsertTree(int mydata, Tree *&t) {
	if(t == NULL) {
		t = new Tree(mydata, NULL, NULL);
	}
	else if(mydata >= t->data){
		InsertTree(mydata, t->right);
	}else if(mydata < t->data)
		InsertTree(mydata, t->left);
	else{}
}

List *list = NULL, *lst = NULL;
void visit(Tree *root) {
	if(root == NULL)
		return;
	visit(root->left);
	if(list == NULL){
		list = new List(root->data,NULL, NULL);
		lst = list;
		return;
	}
		
	else {
		List *tmp = new List(root->data, NULL, NULL);
		lst->next = tmp;
		tmp->prev = lst;
		lst = lst->next;
	}	
	//cout<<root->data;
	visit(root->right);
}
void MakeList(Tree *root) {
	visit(root);
	for(; list!= NULL; list= list->next) {
		cout<<list->data<<"    ";
	}
	cout<<endl;
}
void DeleteTree(Tree *root) {
	if(root == NULL)
		return;
	DeleteTree(root->left);
	DeleteTree(root->right);
	delete root;
	root = NULL;
}
int main() {
	Tree *root;
	int n, a;
	cin>>n;
	cin>>a;
	root = MakeTree(a);
	for(int i = 1; i<n; i++) {
		cin >>a;
		InsertTree(a,root);
	}
	MakeList(root);
	system("pause");

}
/*
7
5 15 -30 10 -5 40 10
*/


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值