zoukankan      html  css  js  c++  java
  • 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 };
  • 相关阅读:
    微信公众平台开发(51)会员卡
    iOS UIViewController的瘦身计划
    NSProxy
    Xcode
    NSPredicate
    NSArray、NSDictionary
    iOS Runtime
    iOS UmbrellaFramework
    iOS UmbrellaHeader
    iOS OCR
  • 原文地址:https://www.cnblogs.com/kexinxin/p/10163084.html
Copyright © 2011-2022 走看看