#include "Tree.h"
using namespace std;
//这道题的难点不在算法,而在对于各种情况的考虑,和code的实现
vector<Node*> getTwoErr(Node* head)
{
vector<Node*> err(2);
err[0] = nullptr;
err[1] = nullptr;
if(head == nullptr)
return err;
stack<Node*> nStack;
Node* pre = nullptr;
while(!nStack.empty() || head != nullptr)
{
if(head)
{
nStack.push(head);
head = head->left;
} else {
head = nStack.top();
nStack.pop();
if(pre != nullptr && pre->value > head->value)
{
err[0] = err[0] == nullptr ? pre : err[0];
err[1] = head;
}
pre = head;
head = head->right;
}
}
return err;
}
vector<Node*> getTwoErrParents(Node* head, Node* e1, Node* e2)
{
vector<Node*> errParent(2);
errParent[0] = nullptr;
errParent[1] = nullptr;
if(head == nullptr)
return errParent;
stack<Node*> nStack;
while(!nStack.empty() || head != nullptr)
{
if(head)
{
nStack.push(head);
head = head->left;
}else{
head = nStack.top();
nStack.pop();
if(head->left == e1 || head->right == e1)
errParent[0] = head;
if(head->left == e2 || head->right == e2)
errParent[1] = head;
head = head->right;
}
}
return errParent;
}
Node* recoveerTree(Node* head)
{
vector<Node*> errs = getTwoErr(head);
vector<Node*> parents = getTwoErrParents(head, errs[0], errs[1]);
Node* e1 = errs[0];
Node* e1p = parents[0];
Node* e1L = e1->left;
Node* e1R = e1->right;
Node* e2 = errs[1];
Node* e2p = parents[1];
Node* e2L = e2->left;
Node* e2R = e2->right;
if(e1 == head)
{
if(e1 == e2p)
{
e1->left = e2L;
e1->right = e2R;
e2->right = e1;
e2->left = e1L;
} else if(e2p->left == e2)
{
e2p->left = e1;
e2->left = e1L;
e2->right = e1R;
e1->left = e2L;
e1->right = e2R;
} else {
e2p->right = e1;
e2->left = e1L;
e2->right = e1R;
e1->left = e2L;
e1->right = e2R;
}
head = e2;
} else if(e1 == head)
{
if(e2 == e1p)
{
e1->left = e2;
e1->right = e2R;
e2->right = e1R;
e2->left = e1L;
} else if(e1p->left == e1)
{
e1p->left = e2;
e2->left = e1L;
e2->right = e1R;
e1->left = e2L;
e1->right = e2R;
} else {
e1p->right = e2;
e2->left = e1L;
e2->right = e1R;
e1->left = e2L;
e1->right = e2R;
}
head = e1;
}
else
{
if(e1 == e2p)
{
if(e1p->left == e1)
{
e1p->left = e2;
e2->left = e1L;
e2->right = e1;
e1->left = e2L;
e1->right = e2R;
}
if(e1p->right == e1)
{
e1p->right = e2;
e2->left = e1L;
e2->right = e1;
e1->left = e2L;
e1->right = e2R;
}
} else if(e2 == e1p)
{
if(e2p->left == e2)
{
e2p->left = e1;
e2->left = e1L;
e2->right = e1R;
e1->left = e2;
e1->right = e2R;
}
if(e2p->right == e2)
{
e2p->right = e1;
e2->left = e1L;
e2->right = e1R;
e1->left = e2;
e1->right = e2R;
}
}
else
{
if(e1p->left == e1)
{
if(e2p->left == e2)
{
e1p->left = e2;
e2p->left = e1;
e1->left = e2L;
e1->right = e2R;
e2->left = e1L;
e2->right = e1R;
}
else
{
e1p->left = e2;
e2p->right = e1;
e1->left = e2L;
e1->right = e2R;
e2->left = e1L;
e2->right = e1R;
}
}
else
{
if(e2p->left == e2)
{
e1p->right = e2;
e2p->left = e1;
e1->left = e2L;
e1->right = e2R;
e2->left = e1L;
e2->right = e1R;
}
else
{
e1p->right = e2;
e2p->right = e1;
e1->left = e2L;
e1->right = e2R;
e2->left = e1L;
e2->right = e1R;
}
}
}
}
return head;
}
int main()
{
Node* pNode0 = new Node(5);
Node* pNode1 = new Node(7);
Node* pNode2 = new Node(3);
Node* pNode3 = new Node(4);
Node* pNode4 = new Node(5);
Node* pNode5 = new Node(6);
Node* pNode6 = new Node(8);
connectTree(pNode0, pNode1, pNode2);
connectTree(pNode1, pNode3, pNode4);
connectTree(pNode2, pNode5, pNode6);
pNode0 = recoveerTree(pNode0);
Print(pNode0);
}
调整搜索二叉树中俩个错误节点
猜你喜欢
转载自blog.csdn.net/wzc2608/article/details/80868673
今日推荐
周排行