剑指Offer之二叉树与双向链表

本文介绍如何将二叉搜索树转换为排序的双向链表,通过中序遍历策略,调整树中结点指针指向实现转换,无需创建新结点。详细解析递归过程中的节点链接操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

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

解题思路

参考博客:https://www.cnblogs.com/yi-hui/p/8983825.html

BST的中序遍历输出一个有序的线性表,这是基本策略。定义两个指针,head表示链表的头结点,tail表示递归过程中的尾节点。初始化头结点和尾节点都是空。BST非空的情况下,中序遍历的第一个节点作为headtail的初始值。如果head不是空,说明此时不是初始化状态,那么就应该执行链接操作。因为tail的初始化方式决定了tail标记的节点始终是有序链表的尾节点,那么递归过程中的tail相当于递归过程中root的左孩子,执行向左连接即可。

AC代码

class Solution {
  public:
    TreeNode* Convert(TreeNode* pRootOfTree) {
        if(pRootOfTree == nullptr) {  // 递归结束
            return nullptr; 
        }
        Convert(pRootOfTree->left);  // 递归向左处理

        if(head == nullptr) { // 追加第一个节点,相当于全局的初始化
            head = pRootOfTree;
            tail = pRootOfTree;
        } else {
            tail->right = pRootOfTree;
            pRootOfTree->left = tail;
            tail = pRootOfTree;
        }

        Convert(pRootOfTree->right);  // 递归向右处理

        return head;
    }

    TreeNode* head{nullptr};
    TreeNode* tail{nullptr};
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值