最大搜索二叉树
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);
}
代码如下:
#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);
}
相关文章推荐
- Find Mode in Binary Search Tree:带重复元素的搜索二叉树Morris遍历查找频率最大的元素
- 二叉树10:最大二叉搜索子树
- C++关于搜索二叉树的建立,查询,删除,求最大,最小元素
- 算法导论第十二章关于搜索二叉树的建立,查询,查找最大最小元素值,查找给定结点的直接后继
- 数据结构 找到二叉树中的最大搜索二叉子树
- 找到二叉树中的最大搜索二叉子树
- 找到二叉树中符合搜索二叉树条件的最大拓扑结构
- 二叉树问题---找到二叉树中的最大搜索二叉子树
- 数据结构与算法分析笔记与总结(java实现)--二叉树10:最大二叉搜索子树练习题
- 找到二叉树中的最大搜索二叉树
- 二叉树进阶之寻找一棵二叉树中的最大二叉搜索子树
- 找到二叉树中的最大搜索二叉子树
- 简单编程题目连载(十五)——找二叉树中的最大搜索二叉子树
- 打印普通二叉树最大搜索子树
- 找到二叉树中符合搜索二叉树条件的最大拓扑结构
- 【BST】返回搜索二叉树最大的k个数
- 《编程之美》---求二叉树中节点的最大距离
- 二叉搜索树(搜索二叉树)转换成一个双向链表
- 二叉树最大宽度和高度
- 【学习点滴-数据结构-二叉树】求二叉树两个节点之间的最大距离