🔥个人主页:guoguoqiang. 🔥专栏:leetcode刷题
class Solution {
public:
void InOrderConvert(TreeNode* cur,TreeNode*& prev){//因为是搜索树先中序遍历
if(cur==nullptr)
return;
InOrderConvert(cur->left,prev);
cur->left=prev;
if(prev)
prev->right=cur;
prev=cur;
InOrderConvert(cur->right,prev);
}
TreeNode* Convert(TreeNode* pRootOfTree) {
if(pRootOfTree==nullptr)//处理空树的问题
return nullptr;
TreeNode* prev=nullptr;
InOrderConvert(pRootOfTree,prev);
TreeNode* head=pRootOfTree;
while(head->left){//找到中序的首节点,即左树为空的节点
head=head->left;
}
return head;
}
};
这个题中仅需处理为
但在有些题中需要将链表改为循环链表
例如力扣中
将二叉搜索树转化为排序的双向链表
class Solution {
public:
void InOrderConvert(Node* cur,Node*& prev){
if(cur==nullptr)
return;
InOrderConvert(cur->left,prev);
cur->left=prev;
if(prev)
prev->right=cur;
prev=cur;
InOrderConvert(cur->right,prev);
}
Node* treeToDoublyList(Node* root) {
if(root==nullptr)
return nullptr;
Node* prev=nullptr;
InOrderConvert(root,prev);
Node* head=root;
while(head->left){
head=head->left;
}
head->left=prev;
prev->right=head;//将链表首尾相连
return head;
}
};