剑指Offer——(26)二叉搜索树与双向链表

将给定的二叉搜索树通过调整节点指针转化为一个排序的双向链表,不创建新节点。
摘要由CSDN通过智能技术生成

题目描述:

输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。

实现如下:

//二叉搜索树的结构特点:根的左子树的节点值都小于根节点值,右子树的节点值都大于根节点值
//构建一个有序的双向链表可以利用left作为前驱、right作为后继
//       5
//   4      7
// 2   3  6    8
//2⇿3⇿4⇿5⇿6⇿7⇿8⇿
//root->left链接到已构建双向链表的最后一个节点
//root->right链接到右子树的最小值节点
//递归方式处理每一个root
//注意:
//1.因为最后要返回构建的双向链表的head,所以一开始就找到最小值节点。O(logn)
//2.在线测试用例为无头链表
//3.仔细思考指针赋值变化
/*节点结构体定义
struct TreeNode
{
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
    TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
*/
class Solution
{
    TreeNode *lastNode = NULL;//记录构建的双向链表的最后一个节点
    TreeNode *linkListHead = NULL;//记录所构建的双向链表的head
public:
    void findMinNode(TreeNode* pRootOfTree)//寻找双向链表的head
    {
        if (pRootOfTree == NULL) return;//防御性动作
        while (pRootOfTree != NULL)
        {
            linkListHead = pRootOfTree;
            pRootOfTree = pRootOfTree->left;
        }
    }
    void BSTToOrderTwoWayLinkList(TreeNode* pRootOfTree)
    {
        if (pRootOfTree->left != NULL)//如果左子树不为空,则继续递归
            BSTToOrderTwoWayLinkList(pRootOfTree->left);

        pRootOfTree->left = lastNode;//将root->left链接到链表的最后一个节点
        if (lastNode != NULL)//如果前驱不为空,则将前驱的right链接到root
            lastNode->right = pRootOfTree;
        lastNode = pRootOfTree;//root变为链表的最后一个节点

        if (pRootOfTree->right != NULL)//如果右子树不为空,则继续递归
            BSTToOrderTwoWayLinkList(pRootOfTree->right);
    }
    TreeNode* Convert(TreeNode* pRootOfTree)
    {
        if (pRootOfTree == NULL) return linkListHead;//防御性动作
        findMinNode(pRootOfTree);//寻找双向链表head
        BSTToOrderTwoWayLinkList(pRootOfTree);//开始递归调用
        return linkListHead;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值