找到二叉樹中的最大搜尋二叉子樹

2022-09-19 12:27:14 字數 2786 閱讀 7089

題目:找到二叉樹中的最大搜尋二叉子樹

《程式設計師**面試指南》第37題 p121 難度:尉

★★☆☆

書上原話:「本題涉及二叉樹面試題中乙個很常見的套路,也是全書的乙個重要內容」。可見其重要性。

這個套路的名字叫做樹形dp套路

樹形dp套路使用前提:如果題目求解目標是s規則,則求解流程可以定成以每乙個節點為頭結點的子樹在s規則下的每乙個答案,並且最終答案一定在其中。

以本題為例,求解流程可以定成:在整棵二叉樹中,求出每乙個節點為頭結點的子樹的最大搜尋二叉子樹(對任何一棵子樹都求出答案),並且最終答案(整棵二叉樹的最大搜尋二叉子樹)一定在其中。

樹形dp套路第一步:以某個節點x為頭結點的子樹中,分析答案有哪些可能性,並且這種分析是以x的左子樹、x的右子樹和x整棵樹的角度來考慮可能性的。

以本題舉例,包含三種可能性。概括而言,最大搜尋二叉子樹可能來自左子樹右子樹,或者是用x連起左子樹和右子樹所構成的整體

樹形dp套路第二步:根據第一步的可能性分析,列出所有需要的資訊。

以本題舉例,左樹上需要的資訊為leftmaxbstheadleftbstsizeleftmax右樹上需要的資訊為rightmaxbstheadrightbstsizerightmin

樹形dp套路第三步,合併第二步的資訊,對左樹和右樹提出同樣的要求,並寫出資訊結構。

以本題舉例,合併成包含maxbstheadmaxbstsizemaxminreturntype類。需要通過它們來判斷第一步中的三種可能性。

public class returntype 

}

樹形dp套路第四步:設計遞迴函式,遞迴函式是處理以x為頭結點的情況下的答案,包括

設計遞迴的base case(本題中即為空樹的情況)

直接得到左樹和右樹的所有資訊

把可能性做整合

返回第三步的資訊結構

**如下:

public returntype process(node x) 

// 預設直接得到左樹全部資訊

returntype ldata = process(x.left);

// 預設直接得到右樹全部資訊

returntype rdata = process(x.right);

// 以下過程為資訊整合

// 同時以x為頭的子樹也做同樣的要求,也需要返回如returntype描述的全部資訊

// 以x為頭的子樹的最小值是:左樹最小、右樹最小、x的值,三者中最小的

int min = math.min(x.value, math.min(ldata.min, rdata.min));

// 以x為頭的子樹的最大值是:左樹最大、右樹最大、x的值,三者中最大的

int max = math.max(x.value, math.max(ldata.max, rdata.max));

// 如果只考慮可能性一和可能性二,以x為頭的子樹的最大搜尋二叉樹大小

int maxbstsize = math.max(ldata.maxbstsize, rdata.maxbstsize);

// 如果只考慮可能性一和可能性二,以x為頭的子樹的最大搜尋二叉樹頭節點

node maxbsthead = ldata.maxbstsize >= rdata.maxbstsize ? ldata.maxbsthead

: rdata.maxbsthead;

// 利用收集的資訊,可以判斷是否存在可能性三

if (ldata.maxbsthead == x.left && rdata.maxbsthead == x.right

&& x.value > ldata.max && x.value < rdata.min)

// 資訊全部搞定,返回

return new returntype(maxbsthead, maxbstsize, min, max);

}

樹形dp套路就是以上四個步驟,就是利用遞迴函式設計乙個二叉樹後序遍歷的過程先遍歷左子樹收集資訊,然後是右子樹收集資訊,最後在頭節點做資訊整合。因為是遞迴函式,所以對所有的子樹要求一樣,都返回returntype的例項。依次求出每棵子樹的答案,總答案一定在其中。主方法如下:

public node getmaxbst(node head)
詳細解析見書p122-124。(第一次做這種樹形dp套路的題,書上說後面還有一些題是用這種套路來解題,待我做到後面再多加熟練熟練)

找到二叉樹中的最大搜尋二叉子樹

題目 給定一棵二叉樹的頭節點head,已知其中所有節點的值都不一樣,找到含有節點最多的搜尋二叉子樹,並返回這棵子樹的頭節點。public class biggestsubbstintree public static class returndata public static returndata...

二叉樹問題 找到二叉樹中的最大搜尋二叉子樹

題目 給定一棵二叉樹的頭節點head,已知其中所有節點的值都不一樣,找到含有節點最多的搜尋二叉樹,並返回這棵子樹的頭節點。注意子樹的概念 基本思路 以節點node為頭的樹中,最大的搜尋二叉樹只可能來自以下的兩種情況 node的左子樹和右子樹都是搜尋二叉樹,並且左子樹的最大值小於node,右子樹的最小...

找到二叉樹中的最大搜尋二叉樹

題目 給定一顆二叉樹,已知其中所有節點的值都不一樣,找到含有節點最多的二叉搜尋樹,並返回頭節點。注 乙個二叉樹的子樹的葉節點必須是該二叉樹的葉節點。解答 1.後續遍歷 2.每次記錄下最小值,最大值,節總數。如果root左右節點符合,則總數相加後,返回此根節點 否則返回左右節點中節點數最多的節點。輸入...