当前位置:   article > 正文

Leetcode刷题笔记题解(C++):99. 恢复二叉搜索树

Leetcode刷题笔记题解(C++):99. 恢复二叉搜索树

思路:

二叉搜索树的中序遍历是递增序列,可以在中序遍历中记录两个需要交换的节点,直到遍历完毕之后,对两个节点的值进行交换即可得到正确的二叉搜索树

比如中序序列为  1  2   3  7  5  6  4(7比5大记录7为x,6比4大记录4为y,交换x与y)

  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. //用于记录交换节点以及前一个节点
  15. TreeNode* x = nullptr;
  16. TreeNode* y = nullptr;
  17. TreeNode* pre = nullptr;
  18. void recoverTree(TreeNode* root) {
  19. //进行中序遍历
  20. dfs(root);
  21. //如果交换节点都不为空,则进行val交换得到结果
  22. if(x!=nullptr&&y!=nullptr){
  23. int temp = x->val;
  24. x->val = y ->val;
  25. y->val = temp;
  26. }
  27. }
  28. //中序遍历
  29. void dfs(TreeNode* root) {
  30. //如果为空节点,返回
  31. if(root == nullptr) return;
  32. //遍历左子树
  33. dfs(root->left);
  34. //如果当前节点为第一个节点,则pre = 当前节点
  35. if(pre == nullptr) pre = root;
  36. //如果当前节点前面有节点
  37. else{
  38. //如果当前节点的值小于前一个节点的值
  39. if(pre->val > root->val){
  40. //记录当前节点的值,不停的更新y的节点
  41. y = root;
  42. //如果另一个节点为空,则记录前一个节点,固定x节点
  43. if(x == nullptr) x = pre;
  44. }
  45. //每次遍历都需要更新pre节点,即当前节点为前一个节点
  46. pre = root;
  47. }
  48. //遍历右子树
  49. dfs(root->right);
  50. }
  51. };

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号