题目描述
二叉搜索树(BST)中的两个节点被错误地交换了,请在不改变树的结构的情况下恢复这棵树。
思路:二叉树两个节点被交换,存在两种情况。
case 1 是父节点和子节点被交换。
case 2 是不相邻的两个节点被交换。
利用二叉树搜索树中序遍历有序性,如果是case 1, 则发生逆序的两个节点为需要交换值的两个节点;如果是case 2,则存在两处发生逆序的地方, 发生逆序第一处的值被置为大值, 发生逆序第二处的值被置为小值。
/**
* Definition for binary tree
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
void recoverTree(TreeNode *root) {
if (root == NULL)
{
return;
}
TreeNode* prev = NULL;
TreeNode* wrongNode1 = NULL;
TreeNode* wrongNode2 = NULL;
std::stack<TreeNode*> nodes;
TreeNode* p = root;
while (p != NULL || !nodes.empty())
{
if (p != NULL)
{
nodes.push(p);
p = p->left;
}
else
{
p = nodes.top();
nodes.pop();
if (prev != NULL && p->val < prev->val)
{
if (wrongNode1 == NULL)
{
wrongNode1 = prev;
wrongNode2 = p; //是解决父节点和子节点顺序颠倒问题
}
else
{
wrongNode2 = p;
break;
}
}
prev = p;
p = p->right;
}
}
if (wrongNode1 != NULL && wrongNode2 != NULL)
{
int tmpVal = wrongNode1->val;
wrongNode1->val = wrongNode2->val;
wrongNode2->val = tmpVal;
}
}
};