二叉搜索树中的错误节点
找到搜索二叉树中两个错误的节点
http://www.nowcoder.com/questionTerminal/9caad175642e4651a175e6993df9d8b2
二叉搜索树,如果正确采取中序遍历,将是一个递增的序列。
例如正确的中序情况:1 2 3 4 5
那么交换其中任意两个节点情况:
可以发现,其本质是寻找逆序对,可能只有一组1 3 2 4 5
可能有两组:1 5 3 4 2 或 1 4 3 2 5
那么只需要中序遍历二叉树,找到逆序对,第一个数,最后一个数
#include<iostream>
#include<vector>
#include<stack>
using namespace std;
int main()
{
int n,root;
cin>>n>>root;
vector<int> l(n+1,0);
vector<int> r(n+1,0);
for(int i=0;i<n;i++)
{
int fa,lc,rc;
cin>>fa>>lc>>rc;
l[fa]=lc;
r[fa]=rc;
}
int error1=0;
int error2=0;//记录下错误节点
stack<int> stk;
int p=root;
int pre=0;
while(stk.empty()==false || p!=0)
{
if(p!=0) //当前研究节点
{
stk.push(p);//入栈
p=l[p];//移动到左边节点
}
else
{
int top=stk.top();
stk.pop();
if(top<pre) //找到一组逆序对
{
if(error1==0)
error1=pre;
error2=top;
}
pre=top;//填充pre
p=r[top];// 转移到右子树
}
}
if(error1<error2)
cout<<error1<<" "<<error2<<endl;
else
cout<<error2<<" "<<error1<<endl;
}
查看12道真题和解析
360集团公司氛围 413人发布