1.把二元查找树转变成排序的双向链表
题目:
输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。
要求不能创建任何新的结点,只调整指针的指向。
10
/ \
6 14
/ \ / \
题目:
输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。
要求不能创建任何新的结点,只调整指针的指向。
10
/ \
6 14
/ \ / \
4 8 12 16
typedef struct BiTreeNode
{
int data;
struct BiTreeNode *lChild,*rChild;
}BiTreeNode;
void ConvertToList(BiTreeNode* root,BiTreeNode* &first,BiTreeNode* &last)
{
if(root == NULL)
{
first = NULL;
last = NULL;
}
BiTreeNode *lFirst,*lLast,*rFirst,*rLast;//分别为左右子树转换后的第一个和最后一个节点
if(root->lChild == NULL && root->rChild = NULL)//二叉树只有一个根节点
{
first = root;
last = root;
}
else if(root->rChild == NULL) //右子树为空
{
ConvertToList(root->lChild,lFirst,lLast);
first = lFirst;
lLast->rChild = root;
root->lChild = lLast;
last = root;
}
else if(root->lChild == NULL) //左子树为空
{
ConvertToList(root->rChild,rFirst,rLast);//转换右子树
first = root;
root->rChild = rFirst;
rFirst->lChild = root;
last = rLast;
}
else
{//左右子树均不为空,分别转换左右子树
ConvertToList(root->lChild,lFirst,lLast);
first = lFirst;
lLast->rChild = root;
root->lChild = lLast;
ConvertToList(root->rChild,rFirst,rLast);
last = rLast;
root->rChild = rFirst;
rFirst->lChild = root;
}
}