JZ36 二叉搜索树与双向链表(C++)


前言

在本篇文章中,我们将会讲解牛客网上一道二叉树经典题目JZ36 二叉搜索树与双向链表,我们用C++来对代码进行编写。

一、题目解析

在这里插入图片描述
注意

🌟要求排序,用到中序遍历
🌟左指针指向前驱,右指针指向后继
🌟不可以创建新的节点,只能在原节点上进行操作。
如果没有这一条,题目非常简单,我们进行一次中序遍历,每个节点放到vector中。再进行前后连接就可以,但是这道题目不允许。
🌟 返回链表中第一个节点的指针,注意返回的是什么。

二、算法原理

我们要完成排序,肯定要进行中序。

本岛题目要求:左指针指向前驱,右指针指向后继

🌟 🌟 我们想要找到前驱很简单,我们先看一下前驱节点(left)

定义两个变量,cur(当前节点)和prev(前一个节点)

cur->left=prev;

在这里插入图片描述
随后更新prev的值就可以:

prev=cur;

在这里插入图片描述

🌟 🌟 后继节点

我们如果想直接找到cur后继节点,不太好找。
但是我们可以很容易发现prev的后继节点,不就是cur蛮。

我们可以在运行过程中,

prev->right=cur;

在这里插入图片描述
之后继续往后走,更新prev
在这里插入图片描述

三、代码编写

class Solution {
public:
    void Inorder(TreeNode*cur,TreeNode*&prev)
	{
		//结束
		if(cur==nullptr)
		{
			return;
		}
		//前序遍历:左子树 根 右子树

		//左子树
		 Inorder(cur->left,prev);
         
		 //右指针指向后继
		 if(prev)
		 {
			prev->right=cur;
		 }
		 //左指针指向前驱
		 cur->left=prev;
		 //迭代
		 prev=cur;

		 //右子树
		 Inorder(cur->right,prev);

	}
    TreeNode* Convert(TreeNode* pRootOfTree) 
	{
		//可能为空树
		if( pRootOfTree==nullptr)
		{
			return  pRootOfTree;
		}
		TreeNode*prev=nullptr;
		Inorder(pRootOfTree,prev);
		//返回链表第一个头节点
		TreeNode*head=pRootOfTree;
		while(head->left)
		{
			head=head->left;
		}
		
		return head;
        
    }
};

🌟 void Inorder(TreeNode*cur, TreeNode * & prev)这个地方一定要用引用,因为这个已经到下一个栈帧了。
🌟 需要找到返回的节点
🌟 注意这个树可能为空树

总结

以上就是今天要讲的内容,本文仅仅详细介绍JZ36 二叉搜索树与双向链表这道题目。希望对大家的学习有所帮助,仅供参考 如有错误请大佬指点我会尽快去改正 欢迎大家来评论~~ 😘 😘 😘

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

lim 鹏哥

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

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

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

打赏作者

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

抵扣说明:

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

余额充值