题目大意

将一颗二叉搜索树,改为只有右子节点的二叉搜索树。

解题思路

  • 遍历一遍,存储节点值,按照题意重建二叉搜索树。空间开销大
  • 原地改变。

要点:

  1. 怎样找到重建后的BST的root。
  2. pre节点的传递,形参or返回值or全局变量

坑点:
要把左子节点都置为空,我说怎么一直报错,无限递归。最后一个节点也要置空..

Code

  1. /**
  2. * Definition for a binary tree node.
  3. * struct TreeNode {
  4. * int val;
  5. * TreeNode *left;
  6. * TreeNode *right;
  7. * TreeNode() : val(0), left(nullptr), right(nullptr) {}
  8. * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
  9. * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
  10. * };
  11. */
  12. class Solution {
  13. public:
  14. TreeNode* pre = nullptr;
  15. TreeNode* ans = nullptr;
  16. void dfs(TreeNode* cur) {
  17. if (cur == nullptr) return ;
  18. dfs(cur->left);
  19. if (pre != nullptr) {
  20. pre->left = nullptr;
  21. pre->right = cur;
  22. }
  23. pre = cur;
  24. if (ans == nullptr || (ans->val > cur->val)) ans = cur;
  25. dfs(cur->right);
  26. }
  27. TreeNode* increasingBST(TreeNode* root) {
  28. dfs(root);
  29. pre->left = pre->right = nullptr;
  30. return ans;
  31. }
  32. };
  33. /**
  34. 精简版 因为是中序遍历,第一次遍历到中的就是new_root,
  35. 2. 同样因为是中序遍历,所以遍历到中时左子节点已经无用了
  36. 所以直接把cur->left==nullptr即可。
  37. */
  38. class Solution {
  39. public:
  40. TreeNode* pre = nullptr;
  41. TreeNode* ans = nullptr;
  42. void dfs(TreeNode* cur) {
  43. if (cur == nullptr) return ;
  44. dfs(cur->left);
  45. if (ans == nullptr) ans = cur;
  46. if (pre != nullptr) pre->right = cur;
  47. cur->left = nullptr;
  48. pre = cur;
  49. dfs(cur->right);
  50. }
  51. TreeNode* increasingBST(TreeNode* root) {
  52. dfs(root);
  53. return ans;
  54. }
  55. };