难度简单
给你一棵二叉搜索树,请你 按中序遍历 将其重新排列为一棵递增顺序搜索树,使树中最左边的节点成为树的根节点,并且每个节点没有左子节点,只有一个右子节点。
示例 1:
输入:root = [5,3,6,2,4,null,8,1,null,null,null,7,9]
输出:[1,null,2,null,3,null,4,null,5,null,6,null,7,null,8,null,9]
思路:
本题需要先对二叉树进行中序遍历搜索,并按照获得的数组顺序进行新树构建;
新树构建中就相当于单纯的建立右子节点的链表。
代码:
// 递归实现遍历二叉树
void getTree(TreeNode* Node, vector<int>& data){
if(Node==nullptr) return;
getTree(Node->left, data);
data.push_back(Node->val);
getTree(Node->right, data);
}
// 循环实现遍历二叉树
void getTreeBy(TreeNode* Node, vector<int>& data ){
stack<TreeNode*> res;
res.push(Node);
while(!res.empty()){
TreeNode* tem=res.top();
res.pop();
if(tem){
if(tem->right) res.push(tem->right);
res.push(tem);
res.push(nullptr);
if(tem->left) res.push(tem->left);
}
else{
data.push_back(res.top()->val);
res.pop();
}
}
}
TreeNode* increasingBST(TreeNode* root) {
vector<int> data;
//getTree(root, data); // 递归实现遍历二叉树
getTreeBy(root, data); // 循环实现中序遍历二叉树
TreeNode* ans=new TreeNode(-1);
TreeNode* cur = ans;
for(auto index:data ){
cur->right = new TreeNode(index);
cur = cur->right;
}
return ans->right;
}