您的位置:首页 > 其它

最大搜索二叉树

2016-09-09 15:59 183 查看
本题考虑到用递归,即递归左子树找到最大搜索二叉树的头结点,递归右子树找到最大搜索二叉树的头结点,对于最大二叉搜索子树来说,我们要知道它的头结点,最大的size(即搜索二叉子树的大小)、搜索二叉子树的最小值,最大值。等于说我们在处理子问题时必须知道这四个参数。我们函数仅返回头结点,其余三个参数用全局数组record[]来保存。

代码如下:

#include<iostream>
#include<string>
using namespace std;

struct Node {
int value;
Node* left;
Node* right;

Node(int data) {
value = data;
left=NULL;
right=NULL;
}
};

Node* posOrder(Node* head, int* record) {
if (head == NULL) {
record[0] = 0;
record[1] = 1000000;
record[2] = -1000000;
return NULL;
}
int value = head->value;
Node* left = head->left;
Node* right = head->right;
Node* lBST = posOrder(left, record);
int lSize = record[0];
int lMin = record[1];
int lMax = record[2];
Node* rBST = posOrder(right, record);
int rSize = record[0];
int rMin = record[1];
int rMax = record[2];
record[1] = min(lMin, value);
record[2] = max(rMax, value);
if (left == lBST && right == rBST && lMax < value && value < rMin) {
record[0] = lSize + rSize + 1;
return head;
}
record[0] = max(lSize, rSize);
return lSize > rSize ? lBST : rBST;
}

Node* biggestSubBST(Node* head) {
int* record = new int[3]; // 0->size, 1->min, 2->max
return posOrder(head, record);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息