题解 | #二叉搜索树与双向链表#
二叉搜索树与双向链表
https://www.nowcoder.com/practice/947f6eb80d944a84850b0538bf0ec3a5
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};*/
class Solution {
public:
TreeNode* find_frist(TreeNode* root)
{
while(root->left)
{
root=root->left;
}
return root;
}
TreeNode* find_LR(TreeNode* root)
{
if(root->left==nullptr)return root;
root=root->left;
while (root->right)
{
root=root->right;
}
return root;
}
TreeNode* find_RL(TreeNode* root)
{
if(root->right==nullptr)return root;
root=root->right;
while (root->left)
{
root=root->left;
}
return root;
}
void change_pair(TreeNode* parent,TreeNode* child)
{
if(child==nullptr)return;
change_pair(child,child->left);
change_pair(child,child->right);
if(child==parent)return;
if(child->left==nullptr&&child->right==nullptr)
{
if(child==parent->left)child->right=parent;
if(child==parent->right)child->left=parent;
}
else if(child->left==nullptr&&child==parent->right)child->left=parent;
else if(child->right==nullptr&&child==parent->left)child->right=parent;
}
TreeNode* Convert(TreeNode* pRootOfTree)
{
if(pRootOfTree==nullptr)return pRootOfTree;
TreeNode* frist_node = find_frist(pRootOfTree);
TreeNode* RL=find_RL(pRootOfTree);
TreeNode* LR=find_LR(pRootOfTree);
change_pair(pRootOfTree,pRootOfTree);
if(LR!=pRootOfTree)
{
pRootOfTree->left=LR;
LR->right=pRootOfTree;
}
if(RL!=pRootOfTree)
{
pRootOfTree->right=RL;
RL->left=pRootOfTree;
}
return frist_node;
}
};
CVTE公司福利 672人发布