LeetCode426 将二叉搜索树转化为排序的双向链表

leetcode.cn/problems/er...

解法一:中序遍历

go 复制代码
// Definition for a Node.
type Node struct {
    Val   int
    Left  *Node
    Right *Node
}

// treeToDoublyList 将二叉搜索树转换为循环双向链表
// 中序遍历BST得到有序节点,再调整指针形成双向循环链表
func treeToDoublyList(root *Node) *Node {
    if root == nil {
        return nil
    }
    
    var pre, head *Node  // pre: 前驱节点, head: 链表头节点
    inorder(root, &pre, &head)  // 中序遍历构建双向链表
    
    // 首尾相连形成循环链表
    if head != nil && pre != nil {
        head.Left = pre   // 头节点的左指针指向尾节点
        pre.Right = head  // 尾节点的右指针指向头节点
    }
    
    return head
}

// inorder 中序遍历二叉树,将节点转换为双向链表
// pre: 指向前驱节点的指针的指针,用于修改前驱节点
// head: 指向链表头节点的指针的指针,仅在第一个节点时赋值
func inorder(node *Node, pre **Node, head **Node) {
    if node == nil {
        return
    }
    
    // 1. 递归遍历左子树
    inorder(node.Left, pre, head)
    
    // 2. 中序位置,处理当前节点
    if *pre == nil {
        // 首次访问节点(最左叶子节点),标记为链表头
        *head = node
    } else { // 建立双向连接
        // 前驱节点的右指针指向当前节点
        (*pre).Right = node
        // 当前节点的左指针指向前驱节点
        node.Left = *pre
    }
    
    // 更新前驱节点为当前节点
    *pre = node
    
    // 3. 递归遍历右子树
    inorder(node.Right, pre, head)
}
相关推荐
编程彩机3 小时前
互联网大厂Java面试:从分布式缓存到消息队列的技术场景解析
java·redis·面试·kafka·消息队列·微服务架构·分布式缓存
她说..3 小时前
策略模式+工厂模式实现单接口适配多审核节点
java·spring boot·后端·spring·简单工厂模式·策略模式
csdn_aspnet3 小时前
ASP.NET 8 - Cookie 身份验证
后端·asp.net·cookie·.net8
笔画人生3 小时前
Cursor + 蓝耘API:用自然语言完成全栈项目开发
前端·后端
xiaoye-duck4 小时前
C++ string 底层原理深度解析 + 模拟实现(上)——面试 / 开发都适用
c++·面试·stl
小旭95274 小时前
Java 反射详解
java·开发语言·jvm·面试·intellij-idea
有来技术4 小时前
ASP.NET Core 权限管理系统(RBAC)设计与实现|vue3-element-admin .NET 后端
vue.js·后端·c#·asp.net·.net
qq_12498707534 小时前
基于springboot的林业资源管理系统设计与实现(源码+论文+部署+安装)
java·vue.js·spring boot·后端·spring·毕业设计·计算机毕业设计
indexsunny5 小时前
互联网大厂Java求职面试实战:Spring Boot微服务与Kafka消息队列应用解析
java·数据库·spring boot·微服务·面试·kafka·jpa
shuair5 小时前
springboot整合redisson单机模式
java·spring boot·后端