题解 | #二叉搜索树与双向链表#

二叉搜索树与双向链表

https://www.nowcoder.com/practice/947f6eb80d944a84850b0538bf0ec3a5

import java.util.*;

/**
 * 树节点的定义
 */
public class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;

    public TreeNode(int val) {
        this.val = val;
    }
}

public class Solution {
    /**
     * 将二叉搜索树转换为排序的双向循环链表
     * @param pRootOfTree 二叉搜索树的根节点
     * @return 排序的双向循环链表的头节点
     */
    public TreeNode Convert(TreeNode pRootOfTree) {
        if (pRootOfTree == null) return null;
        if (pRootOfTree.left == null && pRootOfTree.right == null) return pRootOfTree;
        
        // 将二叉搜索树转换为循环双向链表
        TreeNode res = ConvertToCircularList(pRootOfTree);
        
        // 打破循环结构,返回链表头节点
        res.left.right = null;
        res.left = null;
        
        return res;
    }

    /**
     * 将二叉搜索树转换为循环双向链表
     * @param pRootOfTree 二叉搜索树的根节点
     * @return 循环双向链表的头节点
     */
    private TreeNode ConvertToCircularList(TreeNode pRootOfTree) {
        if (pRootOfTree == null) return null;
        
        // 将左右子树转换为循环双向链表
        TreeNode leftHead = ConvertToCircularList(pRootOfTree.left);
        TreeNode rightHead = ConvertToCircularList(pRootOfTree.right);
        
        // 使当前节点成为循环双向链表
        pRootOfTree.left = pRootOfTree;
        pRootOfTree.right = pRootOfTree;
        
        TreeNode res = pRootOfTree;
        
        // 合并左子链表和当前节点链表
        if (leftHead != null) {
            res = combineTwoTreeNodes(leftHead, res);
        }
        
        // 合并右子链表和当前节点链表
        if (rightHead != null) {
            res = combineTwoTreeNodes(res, rightHead);
        }
        
        return res;
    }

    /**
     * 合并两个循环双向链表
     * @param left 左子链表的头节点
     * @param right 右子链表的头节点
     * @return 合并后的循环双向链表的头节点
     */
    public TreeNode combineTwoTreeNodes(TreeNode left, TreeNode right) {
        TreeNode res = left;
        TreeNode tmp = left.left;
        TreeNode tmp1 = right.left;
        
        // 连接左子链表的尾节点和右子链表的头节点
        left.left = right.left;
        right.left = tmp;
        
        // 连接右子链表的尾节点和左子链表的头节点
        tmp.right = right;
        tmp1.right = left;
        
        return res;
    }
}

全部评论

相关推荐

牛客928043833号:在他心里你已经是他的员工了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务