调整搜索二叉树中俩个错误节点

#include "Tree.h"
using namespace std;
//这道题的难点不在算法,而在对于各种情况的考虑,和code的实现
vector getTwoErr(Node* head)
{
    vector err(2);
    err[0] = nullptr;
    err[1] = nullptr;
    if(head == nullptr)
        return err;
    stack 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 getTwoErrParents(Node* head, Node* e1, Node* e2)
{
    vector errParent(2);
    errParent[0] = nullptr;
    errParent[1] = nullptr;
    if(head == nullptr)
        return errParent;
    stack 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 errs = getTwoErr(head);
    vector 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);
}

你可能感兴趣的:(第三章,程序员代码面试指南c++实现)