题目描述:
二叉搜索树中的两个节点被错误地交换。
请在不改变其结构的情况下,恢复这棵树。
判断错误节点的方法是按照中序遍历,选择出值大小相反的节点。在遍历时,记下错误的节点,若为相邻节点,则输出之后互换,若不相邻,则记下第一个节点处的前一个节点(此时这个节点比当前节点大,是错误节点),第二个节点处为错误节点(比前一个节点大),最后将这两个互换,输出。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
int midOrder(struct TreeNode **p,struct TreeNode **r1,struct TreeNode **r2,struct TreeNode *root)
{
if(root==NULL) return 0;
if(midOrder(p,r1,r2,root->left)==-1) return -1; //中序遍历
if(*p!=NULL&&(*p)->val>root->val)
{
if(*r1==NULL)//若为相邻节点错误或第一个节点处错误
{
*r1=*p;
*r2=root;
}
else//如果不是相邻节点,是交换位置错误
{
*r2=root;
return -1;
}
}
*p=root;//设置前一个节点
if(midOrder(p,r1,r2,root->right)==-1) return -1;//中序遍历
return 0;
}
void recoverTree(struct TreeNode* root){
struct TreeNode *p=NULL;
struct TreeNode *r1=NULL;
struct TreeNode *r2=NULL;
midOrder(&p,&r1,&r2,root);
int n;
//交换两个错误位置的节点
n=r1->val;
r1->val=r2->val;
r2->val=n;
return;
}