1、如何将二叉排序树转换为排序的双向链表
2015-04-27 16:39
267 查看
输入:二叉查找树
左边子树比根小,右边子树比根大
输出:双向排序的链表
头开始 : 增序
尾开始: 降序
分析:
中序遍历二叉查找树,可以的到一个有序的链表;
每次访问一个树节点时,如果左子树和右子树是有序的,那么只需要调整三个节点:
左边子树链表的尾节点(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;
}
左边子树比根小,右边子树比根大
输出:双向排序的链表
头开始 : 增序
尾开始: 降序
分析:
中序遍历二叉查找树,可以的到一个有序的链表;
每次访问一个树节点时,如果左子树和右子树是有序的,那么只需要调整三个节点:
左边子树链表的尾节点(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;
}
相关文章推荐
- 前序和中序重建二叉树、二叉排序树转换为排序的双向链表
- 将二叉排序树BST转换成排序的双向链表
- 二叉排序树转换成排序的双向链表
- 1.1把二叉排序树转变成排序的双向链表
- 树:将二叉搜索树转换为排序的双向链表
- 剑指offer27---将二叉搜索树转换成一个排序的双向链表
- 二元查找树转换为排序的双向链表
- 将二叉搜索树转换成一个排序的双向链表
- 【面试题】剑指offer27--将一颗二叉搜索树转换成一个排序的双向链表
- 二叉排序树与双向链表的转换
- 【面试题】剑指Offer-27-将二叉搜索树转换成排序的双向链表
- 二叉排序树转化为排序的双向链表
- 二元查找树转换成一个排序的双向链表
- 1将该二元查找树转换成一个排序的双向链表
- day17之将二叉搜索树转换成一个排序的双向链表
- 将二叉搜索树转换成一个排序的双向链表
- 微软100道算法题第一题------二叉排序树变成排序的双向链表
- 查找二叉树转换为排序的双向链表
- 二叉排序树转换为有序双向链表
- 第10题 把二元查找树转换成排序的双向链表