📟作者主页:慢热的陕西人
🌴专栏链接:力扣刷题日记
📣欢迎各位大佬👍点赞🔥关注🚓收藏,🍉留言
文章目录
- 牛客热题:二叉树与双向链表
- 题目链接
- 方法一:递归
- 思路
- 代码
- 复杂度
牛客热题:二叉树与双向链表
题目链接
二叉搜索树与双向链表_牛客题霸_牛客网 (nowcoder.com)
方法一:递归
思路
- 定义了一个辅助函数
_mid(TreeNode* root)
,用来进行中序遍历,并在遍历的过程中构建双向链表。- 若当前节点为空,直接返回。
- 递归遍历左子树。
- 在中序遍历的过程中,寻找中序遍历的第一个节点,即为头节点。
- 然后将当前节点的左指针指向上一个处理过的节点
preNode
,如果preNode
不为空,则将其右指针指向当前节点root
。 - 更新
preNode
为当前节点root
。 - 递归遍历右子树。
- 整个过程通过中序遍历,依次处理每个节点。最终返回双向链表的头节点。
代码
TreeNode* res = nullptr;
bool flag = true;
TreeNode* preNode = nullptr;
void _mid(TreeNode* root)
{
if(root == nullptr) return ;
_mid(root->left);
//标记双链表的头节点
if(flag) res = root, flag = false;
root->left = preNode;
if(preNode) preNode->right = root;
preNode = root;
_mid(root->right);
}
TreeNode* Convert(TreeNode* pRootOfTree)
{
_mid(pRootOfTree);
return res;
}
复杂度
时间复杂度:O(N),等于中序遍历的时间复杂度。
空间复杂度:O(N)。没有申请新的空间,但是递归调用栈占用了N的空间。