输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表。要求不能创建任何新的节点,只能调整树中节点指针的指向。
我们希望将这个二叉搜索树转化为双向循环链表。链表中的每个节点都有一个前驱和后继指针。对于双向循环链表,第一个节点的前驱是最后一个节点,最后一个节点的后继是第一个节点。
下图展示了上面的二叉搜索树转化成的链表。“head” 表示指向链表中有最小元素的节点。
特别地,我们希望可以就地完成转换操作。当转化完成以后,树中节点的左指针需要指向前驱,树中节点的右指针需要指向后继。还需要返回链表中的第一个节点的指针。
解题思路
1、排序的循环双向链表,需要将二叉树进行中序遍历
2、不能创建新的节点,只能改变节点的指向,即
(1)定义两个指针cur和pre,分别指向当前节点和前驱节点
(2)更换指针指向pre->right=cur;cur->left=pre;
解题思路
方法一:dfs 中序遍历
得到结果返回
class Solution {
public:
int kthLargest(TreeNode* root, int k) {
if(root == nullptr) return 0;
dfs(root);
return res[res.size()-k];
}
private:
vector<int> res;
void dfs(TreeNode* cur)
{
if(cur == nullptr) return;
dfs(cur->left);
res.emplace_back(cur->val);
dfs(cur->right);
}
};
方法二:对方法一进行更改
class Solution {
public:
int kthLargest(TreeNode* root, int k) {
if(root == nullptr || k == 0) return 0;
dfs(root, k);
return res;
}
private:
int res;
void dfs(TreeNode* cur, int &k)
{
if(!cur) return;
dfs(cur->right, k);
k--;
if(!k) res = cur->val;
dfs(cur->left, k);
}
};