题目描述:
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
思路:
递归地把转换成左右子树这两个问题解决之后再把转换后得到的左右链表和根节点连接起来。每一个子树返回该子树对应的链表的头和尾巴。然后将左子树的尾巴和根节点连接,右子树的头和root连接,同时返回此子树对应的头和尾巴(根据左右子树的情况,返回的头和尾巴有四种情况: case 1. 左子树的头和右子树的尾巴,case 2.是左子树的头和root,case 3. root和右子树的尾巴,case 4 root和root)。
class Solution {
public:
TreeNode* Convert(TreeNode* pRootOfTree)
{
if(pRootOfTree==nullptr)
return nullptr;
TreeNode* head = nullptr;
TreeNode* tail= nullptr;
helper(pRootOfTree, head, tail);
return head;
}
void helper(TreeNode* root, TreeNode* &head,TreeNode* &tail){
TreeNode* lhead = nullptr;
TreeNode* ltail= nullptr;
TreeNode* rhead = nullptr;
TreeNode* rtail= nullptr;
if(root == nullptr)
return;
helper(root->left, lhead, ltail);
helper(root->right, rhead, rtail);
if(lhead!=nullptr){
head = lhead;
ltail ->right = root;
root ->left = ltail;
} else {
head = root;
}
if(rhead!=nullptr) {
tail = rtail;
root ->right = rhead;
rhead->left = root;
} else {
tail = root;
}
}
};
时间复杂度为树的大小o(n)