递增顺序搜索树
给你一棵二叉搜索树,请你 按中序遍历 将其重新排列为一棵递增顺序搜索树,使树中最左边的节点成为树的根节点,并且每个节点没有左子节点,只有一个右子节点。
思路:
例:
- 将中序遍历结果放入临时数组。
- 创建新树,将数组中的值放入新树的右子树。
- 返回新树的右子树指针。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
// 递归中序遍历将搜索树存入数组
void inorder(TreeNode* &node, vector<int> &res) {
if(node == nullptr) return;
inorder(node->left, res);
res.push_back(node->val);
inorder(node->right, res);
}
public:
TreeNode* increasingBST(TreeNode * &root) {
if(!root) return nullptr;
if(!root->left || !root->right) return root;
vector<int> res(0);
inorder(root, res);
// 新建一棵树
TreeNode *newNode = new TreeNode(-1);
TreeNode *currNode = newNode;
for(auto const &value : res) {
// 创建右子树
currNode->right = new TreeNode(value);
currNode = currNode->right;
}
return newNode->right;
}
};
- 时间复杂度:O(n)
- 空间复杂度:O(n)