题解 | #二叉搜索树与双向链表#
二叉搜索树与双向链表
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; } }