题目来自LeetCode,链接:面试题36. 二叉搜索树与双向链表。具体描述见原题。
这道题目要把二叉搜索树转为排序的循环双向链表,那明显就需要中序遍历来保证有序,循环双向链表的就用两个指针分别指向前一个节点和当前节点,然后根据双向链表的要求操作这两个指针即可。时间复杂度是 O ( n ) O(n) O(n),空间复杂度为 O ( 1 ) O(1) O(1)。
JAVA版代码如下:
/*
// Definition for a Node.
class Node {
public int val;
public Node left;
public Node right;
public Node() {}
public Node(int _val) {
val = _val;
}
public Node(int _val,Node _left,Node _right) {
val = _val;
left = _left;
right = _right;
}
};
*/
class Solution {
private Node head;
private Node preNode;
private void inorderVisit(Node node) {
if (node == null) {
return;
}
inorderVisit(node.left);
if (preNode == null) {
head = node;
}
else {
preNode.right = node;
node.left = preNode;
}
preNode = node;
inorderVisit(node.right);
}
public Node treeToDoublyList(Node root) {
if (root == null) {
return null;
}
inorderVisit(root);
head.left = preNode;
preNode.right = head;
return head;
}
}
提交结果如下:
Python版代码如下:
"""
# Definition for a Node.
class Node:
def __init__(self, val, left=None, right=None):
self.val = val
self.left = left
self.right = right
"""
class Solution:
def treeToDoublyList(self, root: 'Node') -> 'Node':
if not root:
return None
self.preNode = None
self.head = None
def inorderVisit(node):
if not node:
return
inorderVisit(node.left)
if self.preNode:
self.preNode.right = node
node.left = self.preNode
else:
self.head = node
self.preNode = node
inorderVisit(node.right)
inorderVisit(root)
self.preNode.right = self.head
self.head.left = self.preNode
return self.head
提交结果如下: