leetcode--二叉搜索树与双向链表

 题目来自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

 提交结果如下:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值