1.把二元查找树转变成排序的双向链表
题目:
输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。
要求不能创建任何新的结点,只调整指针的指向。
10
/ \
6 14
/ \ / \
4 8 12 16
转换成双向链表
题目:
输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。
要求不能创建任何新的结点,只调整指针的指向。
10
/ \
6 14
/ \ / \
4 8 12 16
转换成双向链表
4=6=8=10=12=14=16。
首先考虑:1.二叉树的结构;2.二叉查找树的构建;3.中序遍历;4.转变为双向链表(双向链表的前后结点可以借用二叉树的左右孩子,且仿照插入链表尾部细节,因是顺序的,故只在末尾插入)
#include<stdio.h>
#include<stdlib.h>
struct BSTreeNode
{
int data;
BSTreeNode *left;
BSTreeNode *right;
};
typedef BSTreeNode DoubleList;
DoubleList *head=NULL;
DoubleList *last=NULL;
void addBSTreeNode(BSTreeNode *&pCurrent, int key)//必须要加引用,否则出不出来结果
//pCurrent由下面可知,地址发生了变化,而如果不加&的话,在被调函数过程中,地址发生变化而不会传回主调函数,只是主调函数指针指向的值可以发生变化
{
if (pCurrent==NULL)
{
BSTreeNode *pBSTree=(BSTreeNode*)malloc (sizeof(BSTreeNode));
pBSTree->data=key;
pBSTree->left=NULL;
pBSTree->right=NULL;
pCurrent=pBSTree;
}
else
{
if ((pCurrent->data) > key)
addBSTreeNode(pCurrent->left,key);
else if ((pCurrent->data) < key)
addBSTreeNode(pCurrent->right,key);
else printf("repeated\n");
}
}
void convertToDoubleList(BSTreeNode *pCurrent)//因是顺序插入,故在链表的末尾插入
{
pCurrent->left=last;
if (last==NULL)
{
head=pCurrent;
}
else
{
last->right=pCurrent;
}
last=pCurrent;
printf("%d ",pCurrent->data);
}
void ergodicBSTree(BSTreeNode *pCurrent)//遍历二叉树
{
if (pCurrent==NULL)
{
return;
}
if (pCurrent->left!=NULL)
{
ergodicBSTree(pCurrent->left);
}
convertToDoubleList(pCurrent);
if (pCurrent->right!=NULL)
{
ergodicBSTree(pCurrent->right);
}
}
int main()
{
BSTreeNode *root=NULL;
addBSTreeNode(root,10);
addBSTreeNode(root,4);
addBSTreeNode(root,6);
addBSTreeNode(root,8);
addBSTreeNode(root,12);
addBSTreeNode(root,14);
addBSTreeNode(root,15);
addBSTreeNode(root,16);
ergodicBSTree(root);
/*//或者从头输出
printf("\n");
DoubleList *p=head;
while(p<=last&&p!=NULL)
{printf("%d ",p->data);p=p->right;}*/
system("pause");
}