前言
在本篇文章中,我们将会讲解牛客网上一道二叉树经典题目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 二叉搜索树与双向链表这道题目。希望对大家的学习有所帮助,仅供参考 如有错误请大佬指点我会尽快去改正 欢迎大家来评论~~ 😘 😘 😘