赞
踩
思路:
二叉搜索树的中序遍历是递增序列,可以在中序遍历中记录两个需要交换的节点,直到遍历完毕之后,对两个节点的值进行交换即可得到正确的二叉搜索树
比如中序序列为 1 2 3 7 5 6 4(7比5大记录7为x,6比4大记录4为y,交换x与y)
- /**
- * 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* x = nullptr;
- TreeNode* y = nullptr;
- TreeNode* pre = nullptr;
- void recoverTree(TreeNode* root) {
- //进行中序遍历
- dfs(root);
- //如果交换节点都不为空,则进行val交换得到结果
- if(x!=nullptr&&y!=nullptr){
- int temp = x->val;
- x->val = y ->val;
- y->val = temp;
- }
- }
- //中序遍历
- void dfs(TreeNode* root) {
- //如果为空节点,返回
- if(root == nullptr) return;
- //遍历左子树
- dfs(root->left);
- //如果当前节点为第一个节点,则pre = 当前节点
- if(pre == nullptr) pre = root;
- //如果当前节点前面有节点
- else{
- //如果当前节点的值小于前一个节点的值
- if(pre->val > root->val){
- //记录当前节点的值,不停的更新y的节点
- y = root;
- //如果另一个节点为空,则记录前一个节点,固定x节点
- if(x == nullptr) x = pre;
- }
- //每次遍历都需要更新pre节点,即当前节点为前一个节点
- pre = root;
- }
- //遍历右子树
- dfs(root->right);
- }
- };
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。