二叉樹中最大搜尋子樹和最大搜尋子結構

2021-10-17 14:41:31 字數 1428 閱讀 9310

輸入描述:

第一行輸入兩個整數 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 即搜尋二叉子樹的大小 搜尋二叉子樹的最小值,最大值。等於說我們在處理子問題時必須知道這四個引數。我們函式僅返回頭結點,其餘三個引數用全域性陣...