牛客—— JZ36 二叉搜索树与双向链表

在这里插入图片描述

  • 审题: 将二叉搜索树,转为排序的双向链表。
  • 思路: 首先排序,肯定是涉及中序遍历,因为中序遍历二叉搜索树,就是排序;其次二叉搜索树和双向链表的节点是类似的,只不过是结构不同罢了,所以中序按序取出节点,然后 再改变一下链接关系就好了;最后 难点就在于 如何改变链接关系。
  • 画图:

必须记录 前一个节点,方便链接,对吧?这是必须的。

(1) 中序遍历我就不说了,现在肯定是从 4节点 开始记录为 cur,pre 默认给为 null

在这里插入图片描述
那么现在,4的左边已经链接好了,但是它的右边还没链接。
在这里插入图片描述
(2) 让 cur 的left 指向 pre ;pre的right 指向 cur再将 cur 赋值给 pre;cur 往上走来到 6节点。
在这里插入图片描述
在这里插入图片描述
这一步很关键,cur 的left 指向 pre 是将 cur当下节点的左边链接好;pre 的right 指向cur 是将上一个节点的右边链接好。所以 现在 6节点也是只链接好了左边,它的右边是下一步 才能完成的。

(3) 让 cur 的left 指向 pre ;pre的right 指向 cur;再将 cur 赋值给 pre;cur 往下走来到 8节点

在这里插入图片描述

cur 的 left 指向 pre
在这里插入图片描述

pre 的 right 指向 cur:
在这里插入图片描述

(4) 让 cur 的left 指向 pre ;pre的right 指向 cur;再将 cur 赋值给 pre;cur 往上走来到 10节点

在这里插入图片描述
cur 的left 指向 pre:

在这里插入图片描述
pre的right 指向 cur :

在这里插入图片描述


  • 以上我画了一半,其实感觉也差不多了,咱们代码实现:
class Solution {
public:
    void inorder_treetolist(struct TreeNode* cur,struct TreeNode*&  pre) {
    if (cur == NULL)
        return ;

    inorder_treetolist(cur->left, pre);
    // 中序中,访问根节点
    cur->left = pre;
    if(pre)
    {
        pre->right = cur;
    }
    pre =cur;
    
    inorder_treetolist(cur->right,pre);
}

struct TreeNode* Convert(struct TreeNode* pRootOfTree ) {
    // write code here
    if (pRootOfTree == NULL)
        return NULL;

    struct TreeNode* prev = NULL;

    inorder_treetolist(pRootOfTree, prev);
    
    // 现在指向的 末尾,所以得向前走,找到头节点。
    struct TreeNode* head = pRootOfTree;
    while(head->left)
    {
        head = head->left;
    }

   return head;
   }
};
  • 看看结果:我是c++实现的,这点需要注意

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

动名词

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值