题目描述


题解
// 力扣
// 注意力扣这里需要双向循环链表,所以比牛客要稍微难一丢丢
// 执行用时:0 ms, 在所有 Java 提交中击败了100.00%的用户
// 内存消耗:37.6 MB, 在所有 Java 提交中击败了89.23%的用户
class Solution {
private Node pre = null
private Node head = null
public Node treeToDoublyList(Node root) {
if (root == null)
return null
// 开始中序遍历,以升序遍历BST结点。
inOrder(root)
// 遍历完,pre在链表尾结点,把头尾结点搭建双向指针
pre.right = head
head.left = pre
return head
}
// 中序遍历函数
private void inOrder(Node node) {
if (node == null)
return
inOrder(node.left)
// 在两个中序遍历函数之间,即为当前结点遍历位置。
// 如果pre为空,说明node是链表头结点
// 如果pre非空,说明中序遍历已经过了头结点,node遍历到了下一个结点
// 而此时pre还在上一个结点位置(头结点),这就可以在pre和node之间搭建双向指针
if (pre != null) {
node.left = pre
pre.right = node
}
else // pre为空,说明node是链表头结点,令head指向链表头结点
head = node
pre = node
inOrder(node.right)
}
}
// 牛客
// 牛客需要稍微修改一下,牛客这里只需要双向链表,没说要双向循环链表
// 运行时间:10ms
// 占用内存:9876k
public class Solution {
private TreeNode pre = null
private TreeNode head = null
public TreeNode Convert(TreeNode pRootOfTree) {
if (pRootOfTree == null)
return null
// 开始中序遍历,以升序遍历BST结点。
inOrder(pRootOfTree)
return head
}
private void inOrder(TreeNode node) {
if (node == null)
return
inOrder(node.left)
if (pre != null) {
node.left = pre
pre.right = node
}
else
head = node
pre = node
inOrder(node.right)
}
}