897. Increasing Order Search Tree

思路:
因为是二叉搜索树,那么就是在中序遍历的基础上进行额外的处理即可
那么就有递归和迭代两种方法。
首先递归有原地算法和非原地算法两种。
原地算法需要有一个头节点,我们从root右子树开始处理,那边处理完,头节点就能在树的开头了。
每当一个结点的right指向前一个结点后,pre就要定位在该节点上,这样才能让其父节点指向右孩子,并且让左孩子指向父节点,并且左孩子能被父亲节点的父亲节点所指。
代码:

/**
 * 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:
    void buildtree(TreeNode*& pre,TreeNode* cur){
        if(cur==nullptr) return ;
        buildtree(pre,cur->right);
        cur->right=pre;
        pre=cur;
        buildtree(pre,cur->left);
        cur->left=nullptr;
    }
    TreeNode* increasingBST(TreeNode* root) {
        TreeNode* pre =nullptr;
        buildtree(pre,root);
        return pre;
    }
};

非原地算法就是算中序遍历存入一个数组中,然后再从数组中建立要求的树。
代码:

/**
 * 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 {
private:
    vector<int> res;
public:
    void buildtree(TreeNode* cur){
        if(cur==nullptr) return;
        buildtree(cur->left);
        res.emplace_back(cur->val);
        buildtree(cur->right);
    }
    TreeNode* increasingBST(TreeNode* root) {
        buildtree(root);
        TreeNode* dummy = new TreeNode(0);
        TreeNode* cur = dummy;
        for(auto a:res){
            cur->right= new TreeNode(a) ;
            cur=cur->right;
        }
        return dummy->right;
    }
};

迭代算法就是用栈来模拟递归,我们需要一个dummy来定位新的树的头节点和一个cur节点用来建立树,我们先深入左子树的最左的节点同时将经历的节点放入栈中,然后到底后,就从栈中取出节点,并让cur->right指向它,并让该节点断开左子树。cur移动到此时的root,也就是cur=cur->right。然后让root=root->right,即进入其右子树进行遍历并重复上述步骤。

/**
 * 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* increasingBST(TreeNode* root) {
        if(root==nullptr) return nullptr;
        stack<TreeNode*> st;
        TreeNode* dummy = new TreeNode(-1);
        TreeNode* cur = dummy;
        while(!st.empty()||root!=nullptr){
            while(root!=nullptr){
                st.push(root);
                root=root->left;
            }
            root=st.top();
            st.pop();
            cur->right=root;
            root->left=nullptr;
            cur=root;
            root=root->right;
        }

        return dummy->right;
    }
};
posted @ 2021-04-25 17:44  Mrsdwang  阅读(34)  评论(0编辑  收藏  举报