剑指offer:二叉搜索树与双向链表

本文介绍如何将二叉搜索树转换为排序的双向链表,不创建新节点,仅调整节点指针。通过中序遍历,利用栈实现转换过程,确保链表节点按升序排列。提供多种实现思路,包括使用两个指针进行右移遍历,从最后一个节点开始向左遍历,以及利用栈进行中序遍历。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

题目描述

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

 

有上图的分析可以看出,通过中序遍历的方法就可以将一棵平衡二叉树转为排序的双向链表(平衡二叉树通过中序便利的方式就可以按照从小到大的顺序排列,遍历过程中改变指针指向即可。)

 

实现1:两个指针,右指针不断右移完成遍历和指针设置

实现2:一个指针,从中序遍历的最后一个节点开始向左遍历

中序遍历
     * step1:二叉树中,每个节点都有两个指向子节点的指针。在双向链表中,每个节点也有两个指针,分别指向它的前一个和后一个节点
     * step2:由于要求转换后的节点是排好序的,我们可以中序遍历树中的每一个节点,因为中序遍历的特点是按照从小到大的顺序遍历二叉树中的每一个节点。
     * step3:按照中序遍历的顺序,当我们把遍历转换到根节点(值为10的节点)时,它的左子树已经变成一个排序链表了,并且处在链表中的最后一个节点是当前值最大的节点。我们把值为8的节点和根节点连接起来,此时链表中的最后一个节点就是10。接着去遍历转换右子树,并把根节点和右子树最小的值连接起来。

实现3:

3.堆栈实现

利用栈实现二叉树的中序遍历:

用中序遍历的方法,每遍历到一个节点时,将该节点保存下来,然后在遍历下一个节点之前,将保存节点的right指向下一个节点,将下一个节点的left指向上一个节点,这样就会形成一个排序的双向链表。然后将之前指向保存的指针指向当前这个节点.

 其实是一个TreeNode的遍历,利用一个栈来实现二叉树的中序遍历。

实现4:

参考博客:

1.https://www.cnblogs.com/edisonchou/p/4793345.html

2.https://www.cnblogs.com/zle1992/p/8035140.html    

3.https://www.cnblogs.com/yi-hui/p/8983825.html

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值