输入:二叉查找树
左边子树比根小,右边子树比根大
输出:双向排序的链表
头开始 : 增序
尾开始: 降序
分析:
中序遍历二叉查找树,可以的到一个有序的链表;
每次访问一个树节点时,如果左子树和右子树是有序的,那么只需要调整三个节点:
左边子树链表的尾节点(lr),当前根节点(root),右边子树的头结点(rh)
典型的递归思想。
解:
节点指针 *head = NULL,*root = 树根节点, *tail = NULL;
转换树(head,tail, root);
//完成转换后head指针指向双向链表的头
//完成转换后tail指针指向双向链表的尾
主算法:
*lt指向左子树的尾节点
*rh指向右子树的头结点
1、边界终止条件
if (根节点为NULL)
{
head = tail = NULL
返回; //遇到空节点返回
}
2、递归处理
转换左子树(head, lt, root->pleft);
//转换后左子树有序
转换右子树(rh, tail,root->pright)
//转换后右子树有序
3、调整三个节点
if(指向左子树转换链表的尾节点指针不为空)
{
lt->右子节点 = root;
root->左子结点 = lt;
}
else
{
//无左子结点,当前根节点是双向链表的头节点
head = root;
}
if(指向右子树转换链表的头节点指针rh不为空)
{
root->右子结点 = rh;
rh->左子结点 = root;
}
else
{
//无右子结点,当前根节点是双向链表的尾节点
tail = root;
}