输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。
要求不能创建任何新的结点,只调整指针的指向。
10
/ \
6 14
/ \ / \
4 8 12 16
转换成双向链表
要求不能创建任何新的结点,只调整指针的指向。
10
/ \
6 14
/ \ / \
4 8 12 16
转换成双向链表
4=6=8=10=12=14=16。
注意二叉排序树的建立过程
#include<stdio.h>
#include<stdlib.h>
struct BiTreeNode
{
int value;
BiTreeNode *left;
BiTreeNode *right;
};
typedef BiTreeNode* BSTree;
typedef BiTreeNode BSTNode;
void Convert(BiTreeNode *& head, BiTreeNode *& tail, BiTreeNode *root)
{
BiTreeNode *left, *right;
if (root == NULL)
{
head = NULL;
tail = NULL;
return;
}
Convert(head, left, root->left);
Convert(right, tail, root->right);
if (left!=NULL)
{
left->right = root;
root->left = left;
}
else
{
head = root;
}
if (right!=NULL)
{
root->right=right;
right->left = root;
}
else
{
tail = root;
}
}
BiTreeNode * treeToLinkedList(BiTreeNode * root)
{
BiTreeNode * head, * tail;
Convert(head, tail, root);
return head;//返回链表的头指针
}
BiTreeNode *searchBST(BiTreeNode *root,int key)
{
if((!root)||(root->value==key))
return root;
else if(key<root->value)
return searchBST(root->right,key);
else return searchBST(root->right,key);
}
BSTree InsertBST(BSTree Tptr,int key)
{
BSTree f,p=Tptr;
while(p)
{
if(p->value==key) //不插入重复数字(关键字)
return Tptr;
f=p; //f记录的是要插入的节点的父结点
p=(key<p->value)?p->Lchild:p->Rchild;
}
p=new BSTNode;
p->key=key;
p->Lchild=p->Rchild=NULL;
if(Tptr==NULL)//如果本来是空树
Tptr=p;
else //原数中已有节点,则将p当作f的左孩子或者右孩子插入
{
if(key<f->value)
f->Lchild=p;
else
f->Rchild=p;
}
return Tptr; //将树的根节点还返回
}
BSTree CreateBST()//建立二叉排序树
{
BSTree T=NULL;
int key;
cout<<"输入元素:"<<endl;
while(1)
{
cin>>key;
if(key==0) //默认不插入关键值是0的节点
break;
T=InsertBST(T,key); //调用插入函数进行插入
}
return T;
}
//中序遍历二叉树
void InOrderTraverse(BiTreeNode * root)
{
if(root->left)
InOrderTraverse(root->left);
if(root)
printf("%d ",root->value);
if(root->right)
InOrderTraverse(root->right);
}
int main()
{
BiTreeNode * root=CreateBST();
InOrderTraverse(root);
printf("\n");
BiTreeNode *head=treeToLinkedList(root);
BiTreeNode * temp=head;
while(temp!=NULL)
{
printf("%d ",temp->value);
temp=temp->right;
}
getchar();
return 0;
}