输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。
要求不能创建任何新的结点,只能调整树中结点指针的指向。
注意:
需要返回双向链表最左侧的节点。
例如,输入下图中左边的二叉搜索树,则输出右边的排序双向链表。
思路: 常规的递归遍历左右子树。
看到比较好的解法是利用中序遍历。二叉搜索树中序遍历完就是有序的了,可以在中序遍历的过程中确定好左右关系。
class Solution {
public:
TreeNode* convert(TreeNode* root) {
if(!root) return root;
auto ans = dfs(root);
return ans.first;
}
pair<TreeNode*,TreeNode*> dfs(TreeNode* root) {
if(root -> left && root -> right) {
auto Left = dfs(root -> left);
auto Right = dfs(root -> right);
Left.second -> right = root;
root -> left = Left.second;
root -> right = Right.first;
Right.first -> left = root;
return {Left.first,Right.second};
}
else if(root -> left) {
auto Left = dfs(root -> left);
Left.second -> right = root;
root -> left = Left.second;
return {Left.first,root};
}
else if(root -> right) {
auto Right = dfs(root -> right);
root -> right = Right.first;
Right.first -> left = root;
return {root,Right.second};
}
else {
return {root,root};
}
}
};