輸入描述:
第一行輸入兩個整數 n 和 root,n 表示二叉樹的總節點個數,root 表示二叉樹的根節點。
以下 n 行每行三個整數 fa,lch,rch,表示 fa 的左兒子為 lch,右兒子為 rch。(如果 lch 為 0 則表示 fa 沒有左兒子,rch同理)
ps:節點的編號就是節點的值。
輸入基本思路3 22 1 3
1 0 0
3 0 0輸出3
研究root開頭的子樹是否滿足二叉搜尋樹,滿足那麼直接返回root的大小採取中序遍歷的方式,可以判斷二叉樹是否為搜尋樹,=》滿足公升序否則開始研究root的左右孩子所在子樹。
**實現
#include#include#includeusing namespace std;
int ans=0;
bool judge(vector&l,vector&r,int root)
else
void dfs(vector&l,vector&r,int root)
dfs(l,r,l[root]);
dfs(l,r,r[root]);
}int main()
dfs(l,r, root);
cout<尋找二叉樹中最大搜尋子結構
與最大搜尋子樹不同,最大子結構可以挑選其中若干的點,使其滿足二叉搜尋樹即可
其特點為,最終樹一定有乙個根節點root,那麼問題可以劃歸為在root中尋找,在root的左右子節點中尋找。
首先關鍵函式是研究以root為根節點的最大搜尋拓撲結構
//研究node節點是否在以root為根節點的子樹中
bool isbstnode(vector&l,vector&r,int root,int node)
//研究以root祖先節點,cur為根節點的cur的最大搜尋子結構
int getsize(vector&l,vector&r,int root,int cur) //注意cur表示當前節點
其關鍵實現為研究乙個節點node是否在root開始的搜尋樹結構中。最終的遞迴函式如下:
void getmax(vector&l,vector&r,int root,int& ans)
int main()
int ans=1;
getmax(l, r, root, ans);
cout<}
最大二叉搜尋子樹
有一棵二叉樹,其中所有節點的值都不一樣,找到含有節點最多 的搜尋二叉子樹,並返回這棵子樹的頭節點.給定二叉樹的頭結點root,請返回所求的頭結點,若出現多個節點最多的子樹,返回頭結點權值最大的。struct treenode class maxsubtree if root null return ...
最大二叉搜尋子樹
有一棵二叉樹,其中所有節點的值都不一樣,找到含有節點最多 的搜尋二叉子樹,並返回這棵子樹的頭節點.1 2 struct treenode 9 10 class maxsubtree 1718 treenode max node subtree treenode root,int maxval,int...
最大搜尋二叉樹
本題考慮到用遞迴,即遞迴左子樹找到最大搜尋二叉樹的頭結點,遞迴右子樹找到最大搜尋二叉樹的頭結點,對於最大二叉搜尋子樹來說,我們要知道它的頭結點,最大的size 即搜尋二叉子樹的大小 搜尋二叉子樹的最小值,最大值。等於說我們在處理子問題時必須知道這四個引數。我們函式僅返回頭結點,其餘三個引數用全域性陣...