找到二叉树中的最大搜索二叉子树

#include "Tree.h"
using namespace std;
Node* posOrder(Node* head, int* record)
{
    if(head == nullptr)
    {
        record[0] = 0;
        record[1] = INT_MAX;
        record[2] = INT_MIN;
        return nullptr;
    }
    int value = head->value;
    Node* left = head->left;
    Node* right = head->right;
    Node* LBST = posOrder(left, record);
    int lSize = record[0];
    int lMax  = record[2];
    int lMin  = record[1];
    Node* RBST = posOrder(right, record);
    int rSize = record[0];
    int rMax  = record[2];
    int rMin  = record[1];
    record[1] = min(lMin, value);
    record[2] = max(value, rMax);
    if(left == LBST && right == RBST && value > lMax && value < rMin)
    {
        record[0] = lSize + rSize + 1;
        return head;
    }
    record[0] = max(lSize, rSize);
    return lSize > rSize ? LBST : RBST;
}

Node* biggest(Node* head)
{
    int record[3];
    return posOrder(head, record);
}
int main()
{
     Node* pNode0 = new Node(0);
    Node* pNode1 = new Node(5);
    Node* pNode2 = new Node(2);
    Node* pNode3 = new Node(3);
    Node* pNode4 = new Node(6);
    Node* pNode5 = new Node(7);
    Node* pNode6 = new Node(8);

    connectTree(pNode0, pNode1, pNode2);
    connectTree(pNode1, pNode3, pNode4);
    connectTree(pNode2, pNode5, pNode6);

    pNode0 = biggest(pNode0);
    Print(pNode0);
}

猜你喜欢

转载自blog.csdn.net/wzc2608/article/details/80722738