//对于数组队列的层序遍历,原题为leetcode二叉搜索子树的最大键值和
//因为这个时间超时无法运过去,但可以对利用队列数组层序遍历进行,对考研算法依旧实用。
int pre=-10000;
int flag=1;
int sum=0;
//判断是否为排序二叉树
void tree_sort(struct TreeNode *root){
if(root==NULL){
return;
}
tree_sort(root->left);
if(root->val<=pre){
flag=0;
}
pre=root->val;
sum+=root->val;
tree_sort(root->right);
}
typedef struct queue{
struct TreeNode *LT;
int front;
int rear;
}Queue;
Queue* Inintqueue(int f){
Queue *q=(Queue*)malloc(sizeof(Queue));
q->LT=(struct TreeNode*)malloc(sizeof(struct TreeNode)*(f+1));
q->front=0;
q->rear=0;
return q;
}
//这里要强烈注意因为这里要取出的地址是二级地址,所以用二级指针,我的理解LT是个数组一级,之后Treenode算一个所以二级
void pop(Queue *q,struct TreeNode **tmep){
*tmep=&(q->LT[q->front]);
q->front++;
}
void enqueue(Queue *q,struct TreeNode *root){
q->LT[q->rear]=*root;
q->rear++;
}
bool isempty(Queue *q){
if(q->front==q->rear){
return true;
}
return false;
}
int f=0;
void sum_point(struct TreeNode *root){
if(root){
f++;
sum_point(root->left);
sum_point(root->right);
}
else{
return;
}
}
int maxSumBST(struct TreeNode* root){
sum_point(root);
Queue *q=Inintqueue(f);
enqueue(q,root);
struct TreeNode *tmep;
int max=0;
while(!isempty(q)){
pop(q,&tmep); //一定要加应用不然过不了不知道为啥
tree_sort(tmep);
if(flag==1){
max=max>sum?max:sum;
}
if(tmep->left){
enqueue(q,tmep->left);
}
if(tmep->right){
enqueue(q,tmep->right);
}
flag = 1;
pre=-100000;
sum = 0;
}
return max;
}
leetcode二叉搜索子树的最大键值和
最新推荐文章于 2024-09-21 21:04:48 发布
文章介绍了如何通过数组队列进行层序遍历来解决LeetCode中的二叉搜索子树最大键值和问题。首先定义了相关变量和辅助函数,包括判断是否为排序二叉树的函数、初始化队列、入队、出队及检查队列是否为空的函数。然后,通过递归计算节点数并初始化队列,进行层序遍历,每次遍历时检查当前子树是否为排序二叉树,并更新最大键值和。
摘要由CSDN通过智能技术生成