寻找二叉树的最大搜索子树

版权声明:长风原创 https://blog.csdn.net/u012846486/article/details/80059884
Node *GetMaxSubBST(Node *root) {
        if (root == NULL)
            return NULL;

        int tree_size = 0; // 最大搜索树的节点个数
        int max_value = 0; // 记录root树中最大的节点值
        int min_value = 0;
        return PostOrder(root, tree_size, max_value, min_value);
    }

    Node *PostOrder(Node *root, int& tree_size, int& max_value, int& min_value) {
        if (root == NULL) {
            tree_size = 0;
            max_value = INT_MIN;
            max_value = INT_MAX;
            return NULL;
        }

        max_value = root->value;
        min_value = root->value;

        int l_tree_size = 0;
        int l_max_value = 0;
        int l_min_value = 0;
        Node *left_bst_root = PostOrder(root->left, l_tree_size, l_max_value, l_min_value);
        max_value = max(max_value, l_max_value);
        min_value = min(min_value, l_min_value);

        int r_tree_size = 0;
        int r_max_value = 0;
        int r_min_value = 0;
        Node *right_bst_root = PostOrder(root->right, r_tree_size, r_max_value, r_min_value);
        max_value = max(max_value, r_max_value);
        min_value = min(min_value, r_min_value);

        if (left_bst_root == root->left && right_bst_root == root->right
            && l_max_value < root->value && root->value < r_min_value)
        {
            tree_size = l_tree_size + r_tree_size + 1;
            return root;
        }

        return l_tree_size > r_tree_size ? left_bst_root : right_bst_root;
    }

猜你喜欢

转载自blog.csdn.net/u012846486/article/details/80059884