博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
左神算法进阶班5_1求二叉树中最大搜索子树大小
阅读量:5918 次
发布时间:2019-06-19

本文共 3977 字,大约阅读时间需要 13 分钟。

【题目】

给定一棵二叉树的头节点head,请返回最大搜索二叉子树的大小

【题解】

简化问题,想到该问题的解答应该有几种情形

第一种可能:

最大搜索二叉子树在head的左子树

第二种可能:

最大搜索二叉子树在head的右子树

第三种可能:

最大搜索二叉子树为自己;利用左子树的最大值与右子树的最小值

递归左子树,再递归右子树

信息1:左子树中最大搜索二叉树的大小

信息2:右子树中最大搜索二叉树的大小

信息3:左子树最大搜索二叉树的头结点

信息4:右子树最大搜索二叉树的头结点

信息5:左子树上的最大值

信息6:右子树上的最小值

使用递归,求每一个结点所包含的最大搜索二叉树

 

【代码】

  

1 #pragma once  2 #include 
3 #include
4 #include
5 6 using namespace std; 7 8 struct Node 9 { 10 int val; 11 Node* l; 12 Node* r; 13 Node(int a) :val(a), l(nullptr), r(nullptr) {} 14 }; 15 16 //递归方式一 17 struct returnType 18 { 19 int size; 20 Node* head; 21 int min; 22 int max; 23 returnType(int s, Node* h, int mi, int ma) :size(s), head(h), min(mi), max(ma) {} 24 }; 25 26 returnType* findSTree1(Node* head) 27 { 28 if (head == nullptr) 29 return new returnType(0, nullptr, INT_MAX, INT_MIN); 30 returnType* lInfo = findSTree1(head->l);//得到左子树的最大搜索二叉树 31 returnType* rInfo = findSTree1(head->r);//得到右子树的最大搜索二叉树 32 33 int selfSize = 0;//判断包含该头节点的整棵树是否为搜索二次树 34 if (lInfo->head == head->l && 35 rInfo->head == head->r && 36 lInfo->max < head->val && 37 rInfo->min > head->val 38 ) 39 selfSize = lInfo->size + 1 + rInfo->size; 40 41 int maxSize = max(max(lInfo->size, rInfo->size), selfSize);//求得最大的搜索二叉树的大小 42 Node* maxHead = nullptr;//选择最大的子树的头结点 43 if (maxSize == selfSize) 44 maxHead = head; 45 else if (maxSize == lInfo->size) 46 maxHead = lInfo->head; 47 else 48 maxHead = rInfo->head; 49 50 //这时返回的是包含head的整颗子树 51 return new returnType(maxSize, maxHead, 52 min(min(lInfo->min, rInfo->min), head->val), 53 max(max(lInfo->max, rInfo->max), head->val)); 54 } 55 56 57 //使用第二种递归 58 59 Node* findSTree2(Node* head, vector
&info) 60 { 61 if (head == nullptr) 62 { 63 info[0] = 0; 64 info[1] = INT_MIN; 65 info[2] = INT_MAX; 66 return nullptr; 67 } 68 vector
hv = info; 69 //得到左右子树的信息 70 Node* lNode = findSTree2(head->l, info); 71 vector
lv = info; 72 Node* rNode = findSTree2(head->r, info); 73 vector
rv = info; 74 //更新信息 75 info[1] = max(max(lv[1], rv[1]), head->val); 76 info[2] = min(min(lv[2], rv[2]), head->val); 77 //判断 78 if (lNode == head->l && rNode == head->r && lv[1] < head->val && rv[2] > head->val) 79 { 80 info[0] = lv[0] + rv[0] + 1; 81 return head; 82 } 83 info[0] = max(lv[0], rv[0]); 84 return lv[0] > rv[0] ? lNode : rNode; 85 } 86 87 88 int maxSTree(Node* head) 89 { 90 vector
info(3,0);//储存字数的大小、最大值、最小值 91 findSTree2(head, info); 92 return info[0]; 93 } 94 95 96 97 98 void Test() 99 {100 Node* root = new Node(9);101 root->l = new Node(8);102 root->r = new Node(1);103 root->l->l = new Node(5);104 root->l->r = new Node(9);105 root->l->l->l = new Node(4);106 root->l->l->r = new Node(6);107 root->r->l = new Node(5);108 root->r->r = new Node(3);109 returnType* p = findSTree1(root);110 cout << p->size << endl;111 112 root = nullptr;113 root = new Node(5);114 root->l = new Node(2);115 root->r = new Node(6);116 root->l->l = new Node(1);117 root->l->r = new Node(3);118 p = findSTree1(root);119 cout << p->size << endl;120 121 root = nullptr;122 root = new Node(9);123 root->l = new Node(8);124 root->r = new Node(1);125 root->l->l = new Node(5);126 root->l->r = new Node(9);127 root->l->l->l = new Node(4);128 root->l->l->r = new Node(6);129 root->r->l = new Node(5);130 root->r->r = new Node(3);131 cout << maxSTree(root) << endl;132 133 root = nullptr;134 root = new Node(5);135 root->l = new Node(2);136 root->r = new Node(6);137 root->l->l = new Node(1);138 root->l->r = new Node(3);139 cout << maxSTree(root) << endl;140 141 142 143 }

 

转载于:https://www.cnblogs.com/zzw1024/p/11072909.html

你可能感兴趣的文章
通过Gearman实现MySQL到Redis的数据复制
查看>>
DataSet
查看>>
有序的双链表
查看>>
Java NIO中的通道Channel(二)分散/聚集 Scatter/Gather
查看>>
zookeeper学习
查看>>
项目管理学习笔记之二.工作分解
查看>>
如何确定所运行的 SQL Server 2005 的版本?
查看>>
CentOS 7 网络配置
查看>>
我的友情链接
查看>>
Linux系统启动流程详解
查看>>
Magento(CE1.X)自带模块解析五
查看>>
linux网络编程涉及的函数
查看>>
Chrome应用技巧之颜色拾取
查看>>
Linux之通配符
查看>>
通过源码解析 Node.js 中一个 HTTP 请求到响应的历程
查看>>
CodeIgniter的密码处理论
查看>>
Tsuru 1.7.0-rc4 发布,基于 Docker 的 PaaS 框架
查看>>
运营不需要人脉?
查看>>
Spring Cloud Config服务器
查看>>
fprobe使用
查看>>