输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。
要求不能创建任何新的结点,只能调整树中结点指针的指向。
注意:
- 需要返回双向链表最左侧的节点。
例如,输入下图中左边的二叉搜索树,则输出右边的排序双向链表。
- 每次返回左边和右边的一对数,然后连接起来;
C++代码:
class Solution {
public:
TreeNode* convert(TreeNode* root) {
if(!root) return NULL;
auto res = dfs(root);
return res.first;
}
pair<TreeNode*,TreeNode*> dfs(TreeNode* root){
if(!root->left && !root->right) return {root,root};
if(root->left && root->right){
auto l_p = dfs(root->left), r_p = dfs(root->right);
root->left = l_p.second; l_p.second->right = root;
root->right = r_p.first; r_p.first->left = root;
return {l_p.first,r_p.second};
}
if(root->left){
auto l_p = dfs(root->left);
root->left = l_p.second; l_p.second->right = root;
return {l_p.first,root};
}
if(root->right){
auto r_p = dfs(root->right);
root->right = r_p.first; r_p.first->left = root;
return {root,r_p.second};
}
}
};