【LeetCode每日一题】剑指 Offer 36. 二叉搜索树与双向链表(持续更新)

简介: 【LeetCode每日一题】剑指 Offer 36. 二叉搜索树与双向链表(持续更新)

今日题目(剑指Offer系列)

剑指 Offer 36. 二叉搜索树与双向链表

输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表。
要求不能创建任何新的节点,只能调整树中节点指针的指向。
为了让您更好地理解问题,以下面的二叉搜索树为例:
我们希望将这个二叉搜索树转化为双向循环链表。链表中的每个节点都有一个前驱和后继指针。对于双向循环链表,第一个节点的前驱是最后一个节点,最后一个节点的后继是第一个节点。
下图展示了上面的二叉搜索树转化成的链表。“head” 表示指向链表中有最小元素的节点。
特别地,我们希望可以就地完成转换操作。当转化完成以后,树中节点的左指针需要指向前驱,树中节点的右指针需要指向后继。还需要返回链表中的第一个节点的指针。

解题思路:

>题目要求将二叉搜索树转化成一个有序链表,然后头尾变成循环链表
>二叉搜索树有个性质就是二叉搜索树的中序遍历就是有序的
>所以本题可以利用该性质,对中序遍历时中间的节点进行操作
>就是用一个pre作为中间节点,保存上次遍历时的节点
>这样就可以在遍历下一个节点时进行建立连接
>pre.right=cur    cur.left=pre    pre=cur

Python解法:

class Solution:
    def treeToDoublyList(self, root: 'Node') -> 'Node':
        def dfs(cur):
            if not cur:
                return
            dfs(cur.left)
            if self.pre==None:
                self.head=cur
            else:
                self.pre.right=cur
            cur.left=self.pre
            self.pre=cur
            dfs(cur.right)
        if root==None:
            return None
        self.head=None
        self.pre=None
        dfs(root)
        self.head.left=self.pre
        self.pre.right=self.head
        return self.head

Java解法:

class Solution {
    public Node head,pre;
    public Node treeToDoublyList(Node root) {
        if(root==null) {
      return null;
    }
    dfs(root);
    head.left=pre;
    pre.right=head;
    return head;
    }
    public void dfs(Node cur) {
    if(cur==null) {
      return;
    }
    dfs(cur.left);
    if(pre==null) {
      head=cur;
    }else {
      pre.right=cur;
    }
    cur.left=pre;
        pre=cur;
    dfs(cur.right);
  }
}


目录
相关文章
|
6天前
【力扣】-- 移除链表元素
【力扣】-- 移除链表元素
16 1
|
13天前
Leetcode第21题(合并两个有序链表)
这篇文章介绍了如何使用非递归和递归方法解决LeetCode第21题,即合并两个有序链表的问题。
34 0
Leetcode第21题(合并两个有序链表)
|
12天前
【LeetCode 45】701.二叉搜索树中的插入操作
【LeetCode 45】701.二叉搜索树中的插入操作
8 1
|
12天前
【LeetCode 44】235.二叉搜索树的最近公共祖先
【LeetCode 44】235.二叉搜索树的最近公共祖先
11 1
|
13天前
LeetCode第二十四题(两两交换链表中的节点)
这篇文章介绍了LeetCode第24题的解法,即如何通过使用三个指针(preNode, curNode, curNextNode)来两两交换链表中的节点,并提供了详细的代码实现。
12 0
LeetCode第二十四题(两两交换链表中的节点)
|
6天前
(剑指offer)18、删除链表的节点—22、链表中倒数第K个节点—25、合并两个排序的链表—52、两个链表的第一个公共节点(2021.12.07)
(剑指offer)18、删除链表的节点—22、链表中倒数第K个节点—25、合并两个排序的链表—52、两个链表的第一个公共节点(2021.12.07)
14 0
|
12天前
【LeetCode 48】108.将有序数组转换为二叉搜索树
【LeetCode 48】108.将有序数组转换为二叉搜索树
26 0
|
12天前
【LeetCode 47】669.修剪二叉搜索树
【LeetCode 47】669.修剪二叉搜索树
7 0
|
12天前
【LeetCode 46】450.删除二叉搜索树的节点
【LeetCode 46】450.删除二叉搜索树的节点
9 0
|
12天前
【LeetCode 42】501.二叉搜索树中的众数
【LeetCode 42】501.二叉搜索树中的众数
7 0