目录
题目:剑指 Offer 36. 二叉搜索树与双向链表 - 力扣(Leetcode)
题目的接口:
解题思路:
代码:
过啦!!!
写在最后:
题目:剑指 Offer 36. 二叉搜索树与双向链表 - 力扣(Leetcode)
题目的接口:
/*
// Definition for a Node.
class Node {
public:
int val;
Node* left;
Node* right;
Node() {}
Node(int _val) {
val = _val;
left = NULL;
right = NULL;
}
Node(int _val, Node* _left, Node* _right) {
val = _val;
left = _left;
right = _right;
}
};
*/
class Solution {
public:
Node* treeToDoublyList(Node* root) {
}
};
解题思路:
这道题,我的想法就是:
中序遍历这一棵二叉搜索树,
然后让他的头指向尾,尾指向头,
递归让每个节点都做一遍,就形成双向链表。
首先中序遍历找到第一个节点cur:
更新头节点,然后让他指向尾节点,
等找到尾节点时,让尾节点再指向头节点:
然后继续找下一个头节点与尾节点互指:
以此类推,
直到中序遍历完整棵二叉搜索树,
最后,再将最开始的头节点head指向最后的尾节点,
最后的尾节点再指向head,
再返回双向链表的头head即可。
代码:
/*
// Definition for a Node.
class Node {
public:
int val;
Node* left;
Node* right;
Node() {}
Node(int _val) {
val = _val;
left = NULL;
right = NULL;
}
Node(int _val, Node* _left, Node* _right) {
val = _val;
left = _left;
right = _right;
}
};
*/
class Solution {
public:
Node* treeToDoublyList(Node* root) {
//判断树是否为空
if(root == nullptr)
{
return nullptr;
}
//中序遍历
dfs(root);
//头节点指向尾
head->left = pre;
//尾节点指向头
pre->right = head;
return head;
}
private:
//创建头尾节点指针
Node* head, *pre;
//中序遍历实现
void dfs(Node* cur)
{
//遍历到底了,返回上一级
if(cur == nullptr)
{
return;
}
//递归左子树
dfs(cur->left);
//之后每一次到这里,让尾节点指向头节点
if(pre != nullptr)
{
pre->right = cur;
}
else//第一次到这里的时候,让头指针指向cur(中序遍历第一个节点)
{
head = cur;
}
//让头节点指向尾节点
cur->left = pre;
//更新尾节点
pre = cur;
//递归右子树
dfs(cur->right);
}
};
过啦!!!
写在最后:
以上就是本篇文章的内容了,感谢你的阅读。
如果喜欢本文的话,欢迎点赞和评论,写下你的见解。
如果想和我一起学习编程,不妨点个关注,我们一起学习,一同成长。
之后我还会输出更多高质量内容,欢迎收看。