将二叉搜索树转换成一个排序的双向链表--中序线索化的变型。

将二叉搜索树转换成一个排序的双向链表。
注意:要求不能创建任何新的结点,只能调整树中结点指针的指向,也就是left当prev,right当next。

在二叉搜索树中,每个结点都有两个分别指向其左、右子树的指针,左子树结点的值总是小于父结点的值,右子树结点的值总是大于父结点的值。在双向链表中,每个结点也有两个指针,它们分别指向前一个结点和后一个结点。所以这两种数据结构的结点是一致,二叉搜索树和双向链表,只是因为两个指针的指向不同而已,完全可以通过改变其指针的指向来实现二者的转换。
思路:
找到二叉搜索树中左子树的最右边的节点,使其与根节点连成双向关系
找到二叉搜索树中右子树的最左边的节点,使其与根节点连成双向关系
这里写图片描述

struct serchTreeNode
{
    serchTreeNode(int data)
    :_data(data)
    , pLeft(NULL)
    , pRight(NULL)
    {}
    int _data;
    serchTreeNode* pLeft;
    serchTreeNode* pRight;

};
serchTreeNode* serchTreeToList(serchTreeNode* pRoot)
{
    //空树
    if (pRoot == NULL)
        return NULL;
    //二叉搜索树只有根节点
    if (pRoot->pLeft == NULL&&pRoot->pRight == NULL)
        return pRoot;
    serchTreeNode* pLeftRoot = serchTreeToList(pRoot->pLeft);//转换左子树
    serchTreeNode* pLeftNode = pLeftRoot;
    while (pLeftNode != NULL&&pLeftNode->pRight != NULL)//找到左子树的最右边的节点(左子树中最大)
    {
        pLeftNode = pLeftNode->pRight;
    }
    //如果左子树链表存在,则将根节点与左子树最右节点连成双向关系
    if (pLeftRoot)
    {
        pLeftNode->pRight = pRoot;
        pRoot->pLeft = pLeftNode;
    }
    serchTreeNode* pRightRoot = serchTreeToList(pRoot->pRight);//转换右子树
    serchTreeNode* pRightNode = pRightRoot;
    while (pRightNode!=NULL&&pRightNode->pLeft!=NULL)//找到右子树最左边的节点(右子树中最小)
    {
        pRightNode = pRightNode->pLeft;
    }
    //如果右子树链表存在,则将根节点与右子树最左节点连成双向关系
    if (pRightRoot)
    {
        pRightNode->pLeft = pRoot;
        pRoot->pRight = pRightNode;
    }
    if (pLeftRoot)
        return pLeftRoot;
    else
        return pRightRoot;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值