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;
}
};