LeetCode 99 恢复二叉搜索树

  • 分析
    这道题使用中序遍历来解决,关键是中间的访问。例如123,交换两个数字之后会变成 3 2 1。需要注意的是,如果pre -> val > root -> val的时候就说明遇到了出错的节点,第一个出错的节点是pre,第二个出错的节点是root。这一步需要耐心的分析。为了避免进行特殊处理,开始时给新建一个节点给pre,并把pre -> val的值设置成最小的值。 锻炼递归思维。
  • 代码
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
    
    
public:
    void recoverTree(TreeNode* root) {
    
    
        TreeNode* s = nullptr;
        TreeNode* t = nullptr;
        TreeNode* prev =   new TreeNode(INT_MIN);//为了避免特殊处理
        traverse(root, s, t, prev);
        if(s != nullptr && t != nullptr){
    
    
            int temp = s -> val;
            s -> val = t -> val;
            t -> val = temp;
        }
        delete prev;        
    }

    void traverse(TreeNode* root, TreeNode*& s, TreeNode*& t, TreeNode*& prev){
    
    
        if(!root) return;
        traverse(root -> left,s, t, prev);
        if(root -> val < prev -> val){
    
    
            s = (s == NULL) ? prev : s;
            t = root;
        }
        prev = root;
        traverse(root -> right, s, t, prev);
    }
};

猜你喜欢

转载自blog.csdn.net/xiaoan08133192/article/details/115232519