简单粗暴,先中序遍历一下二叉树,保存对应的数组下标和值。如果是有序的二叉检索树中序遍历应该是一个非减的数列。把值排序得到有序的数列,然后按着下标和排序后的值重新给原有的树赋值,最后层序遍历输出。
leetcode上有个题跟这个比较像,99. 恢复二叉搜索树(好吧几乎一样,一个数组一个用指针),题解里有常数空间的解决方法(Morris),可参考
#include <stdio.h>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;
int n;
struct Node{
int val,left,right;
}node[105];
vector<int> arr,idx;
void inorder(int curr){
if(curr==-1)return;
inorder(node[curr].left);
arr.push_back(node[curr].val);
idx.push_back(curr);
inorder(node[curr].right);
}
int main(){
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d %d",&node[i].left,&node[i].right);
}
for(int i=0;i<n;i++){
scanf("%d",&node[i].val);
}
inorder(0);
sort(arr.begin(),arr.end());
for(int i=0;i<n;i++){
if(node[idx[i]].val!=arr[i])node[idx[i]].val=arr[i];
}
queue<int> q;
q.push(0);
while(!q.empty()){
int curr=q.front();
q.pop();
printf("%d",node[curr].val);
if(node[curr].left!=-1) q.push(node[curr].left);
if(node[curr].right!=-1) q.push(node[curr].right);
if(!q.empty())printf(" ");
}
}