36.二叉搜索树和双向链表

36. 二叉搜索树和双向链表

1 题目描述

​ 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表。要求不能创建任何新的节点,只能调整树中节点指针的指向。

例:

在这里插入图片描述

2 题目分析

​ 由于二叉搜索树也是一种排序的数据结构,因此我们只要改变指针指向返回头结点即可。问题是如何维护双向链表的左右指向以及头结点,对于一个节点去同时维护左边和右边显得没有必要,因此我们可以对二叉树进行中序遍历每次只改变当前节点和pre节点之间的指向(即pre.right=cur,cur.left=pre),好了指针指向解决了,头结点如何找到呢,我们初始化pre=null,之后会不断更新pre的位置,那么当cur指向1的时候pre为null,故我们可知当pre为null时头结点就是cur。由于是循环链表,最后再更新head和pre之间的关联即可,思路有了代码写起来就很容易了。

3 代码

class Solution {
    /*
        思想:中序遍历,设置两个指针pre和cur,遍历中依次进行连接操作(即:cur.left = pre,pre.right = cur
        ;pre = cur),需要注意的是pre为空的时候当前节点就是头结点,遍历结束后的pre更新为最后的节点;因此中序
        遍历结束后对head和pre进行连接操作(head.left = pre; pre.right = head)
    */
    Node head, pre;
    public Node treeToDoublyList(Node root) {
        if (root == null) return null;
        inOder(root);
        head.left = pre;
        pre.right = head;
        return head;
    }

    private void inOder(Node root) {
        if (root == null) return;
        inOder(root.left);
        if (pre == null) {
            head = root;
        } else {
            pre.right = root;
        }
        root.left = pre;
        pre = root;
        inOder(root.right);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值