题目大意
解题思路
- 遍历一遍,存储节点值,按照题意重建二叉搜索树。空间开销大
- 原地改变。
要点:
- 怎样找到重建后的BST的root。
- pre节点的传递,形参or返回值or全局变量
坑点:
要把左子节点都置为空,我说怎么一直报错,无限递归。最后一个节点也要置空..
Code
/*** 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 {public:TreeNode* pre = nullptr;TreeNode* ans = nullptr;void dfs(TreeNode* cur) {if (cur == nullptr) return ;dfs(cur->left);if (pre != nullptr) {pre->left = nullptr;pre->right = cur;}pre = cur;if (ans == nullptr || (ans->val > cur->val)) ans = cur;dfs(cur->right);}TreeNode* increasingBST(TreeNode* root) {dfs(root);pre->left = pre->right = nullptr;return ans;}};/**精简版 因为是中序遍历,第一次遍历到中的就是new_root,2. 同样因为是中序遍历,所以遍历到中时左子节点已经无用了所以直接把cur->left==nullptr即可。*/class Solution {public:TreeNode* pre = nullptr;TreeNode* ans = nullptr;void dfs(TreeNode* cur) {if (cur == nullptr) return ;dfs(cur->left);if (ans == nullptr) ans = cur;if (pre != nullptr) pre->right = cur;cur->left = nullptr;pre = cur;dfs(cur->right);}TreeNode* increasingBST(TreeNode* root) {dfs(root);return ans;}};
