二叉搜索树转双向链表

二叉搜索树:左边子树小于节点,右子树大于节点。

双向链表:排升序,并且需要前后节点互相有连接,即前面节点的右节点连接到后面节点,而后面节点的左节点连接到前面节点。

由题可以知:

我们需要进行中序遍历,也就是左中右。并且需要使用双指针法,我们需要将前一个节点保存下来,这样才能将前一个节点的右节点连接到当前节点。

首先进行设置遍历的函数,

先传入根节点和设置的前一个节点,此时前一个节点为空。

我们进行中序遍厉,不断遍历之后,cur回来到左子树的最左边的那个节点即最小的那个节点。

此时这是最后一层递归完,可以开始执行下面的语句了。

我们需要将cur的left指向prev,然后prev的right指向cur,但此时prev为空则它的right不能指向cur,并且链表第一个也不能为空,然后我们就跳过将prev的右指向cur这一步,直接将cur赋给prev。

这是递归完之后,返回到递归的上一层。这是就可以将prev的右指向cur,cur的左指向prev。完成之后,prev就会被赋值成cur。

因为是中序遍历,左中遍历后,还需要对右节点进行遍历。就需要将cur的右节点进行一次递归调用。这样此时就变成了4->6->8。便完成了双向链表升序。

因此代码实现就为

由这个代码可知,如果知道题目中需要那种二叉树的遍历,例如前序遍历,就是根左右,就需要具体代码内容第一,左递归第二,最后为右递归的方式来进行代码实现。

其中还需要明白prev必须地址加引用,这样才能在递归中更改它的值,然后在进行往最小节点遍历时,需满足这个节点不为空,并且它的左节点不为空,当不满足时,就说明已经找到了最小节点,或者这个节点一开始就是空,没有内容。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值