最大搜索二叉子树大小(树形dp)
生活随笔
收集整理的這篇文章主要介紹了
最大搜索二叉子树大小(树形dp)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
給定一顆二叉樹的頭節點head,返回這棵二叉樹中最大的二叉搜索子樹
(二叉搜索樹:該二叉樹中左子樹所有節點比它小,右子樹所有節點比它大 );
思路:
這是一道分析可能性求解在二叉樹上做類似動態規劃的問題(樹形dp),這種題就是一種遞歸套路,我們要分析求解的可能性,并由此找到我們所需要的信息,進而通過遞歸求解;
這道題有兩種可能性:
1,與頭節點無關
所需信息:
1.1,左樹最大二叉搜索樹大小
1.2,右樹最大二叉搜索樹大小
2,與頭節點有關
所需信息:
2.1,左樹為二叉搜索樹
2.2,右樹為二叉搜索樹
2.3,左樹節點的最大值max<x<右樹節點的最小值min
由此我們可以知道我們所需要的信息info:
1,最大搜索樹的大小maxSubBSTSize;
2,布爾類型判斷是否為二叉搜索樹isAllBST;
3,最大值max和最小值min
代碼如下:
class Node{public:int val;Node* left;Node* right; }; class info{private:int MaxSubBSTSize;bool isAllBST;int Max;int Min;public:info(int Maxsize, bool is, int ma, int mi){this->MaxSubBSTSize=Maxsize;this->isAllBST=is;this->Max=ma;this->Min=mi;}info process(Node* root){if(!root)return NULL;info leftInfo=process(root->left);info rightInfo=process(root->right);int Max=root->val;int Min=root->val;if(leftInfo){Min=min(Min,leftInfo.Min);Max=max(Max,leftInfo.Max);}if(rightInfo){Min=min(Min,rightInfo.Min);Max=max(Max,rightInfo.Max);}int MaxSubBSTSize=0;if(leftInfo){MaxSubBSTSize=leftInfo.MaxSubBSTSize;}if(rightInfo){MaxSubBSTSize=max(MaxSubBSTSize,rightInfo.MaxSubBSTSize);}bool isAllBST=false;if( (!leftInfo?true:leftInfo.isAllBST)&&(!rightInfo?true:rightInfo.isAllBST)&&(!leftInfo?true:leftInfo.max<root->val)&&(!rightInfo?true:rightInfo.min>root->val)){MaxSubBSTSize=(!leftInfo?0:leftInfo.MaxSubBSTSize)+(!rightInfo?0:rightInfo.MaxSubBSTSize)+1;this->isAllBST=true;}return new Info(MaxSubBSTSize,isAllBST,max,min);} };注:代碼用到了一些java語法,c++無法正常運行
總結
以上是生活随笔為你收集整理的最大搜索二叉子树大小(树形dp)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 打印折痕方向(二叉树应用)
- 下一篇: 逆序栈(递归⚠)