Leetcode 99.恢复二叉搜索树

恢复二叉搜索树

二叉搜索树中的两个节点被错误地交换。

请在不改变其结构的情况下,恢复这棵树。

示例 1:

输入: [1,3,null,null,2]

 

输出: [3,1,null,null,2]

 

示例 2:

输入: [3,1,4,null,null,2]

输出: [2,1,4,null,null,3]

进阶:

  • 使用 O(n) 空间复杂度的解法很容易实现。
  • 你能想出一个只使用常数空间的解决方案吗?

中序遍历二叉树,出现的节点的值会升序排序,如果有两个节点位置错了,那肯定会出现降序。设置一个pre节点指针,记录当前节点中序遍历时的前节点,如果当前节点小于pre节点的值,说明需要调整次序。如果在中序遍历时节点值出现了两次降序,第一个错误的节点为第一次降序时较大的节点,第二个错误节点为第二次降序时较小的节点。比如,原来的搜索二叉树在中序遍历的节点值依次为{1,2,3,4,5},如果因为两个节点位置错了而出现{1,5,3,4,2},第一次降序为5->3,所以第一个错误节点为5,第二次降序为4->2,所以第二个错误节点为2,将5和2换过来就可以恢复。

 1 /**
 2  * Definition for a binary tree node.
 3  * struct TreeNode {
 4  *     int val;
 5  *     TreeNode *left;
 6  *     TreeNode *right;
 7  *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 8  * };
 9  */
10 class Solution{
11 public:
12     TreeNode* mistake1;
13     TreeNode* mistake2;
14     TreeNode* pre=NULL;
15 
16     void recoverTree(TreeNode* root){
17         recursive_traversal(root);
18         if(mistake1!=NULL && mistake2!=NULL){
19             swap(mistake1->val,mistake2->val);
20         }
21     }
22 
23     //递归中序遍历二叉树
24     void recursive_traversal(TreeNode* root){
25         if(root==NULL)
26             return;
27         if(root->left!=NULL){
28             recursive_traversal(root->left);
29         }
30         if(pre!=NULL && pre->val>root->val){
31             if(mistake1==NULL){
32                 mistake1=pre;
33                 mistake2=root;
34             }else{
35                 mistake2=root;
36             }
37         }
38         pre=root;
39         if(root->right!=NULL){
40             recursive_traversal(root->right);
41         }
42     }
43 };
原文地址:https://www.cnblogs.com/kexinxin/p/10163084.html