題目:找到二叉樹中的最大搜尋二叉子樹
《程式設計師**面試指南》第37題 p121 難度:尉
★★☆☆
書上原話:「本題涉及二叉樹面試題中乙個很常見的套路,也是全書的乙個重要內容」。可見其重要性。
這個套路的名字叫做樹形dp套路。
樹形dp套路使用前提:如果題目求解目標是s規則,則求解流程可以定成以每乙個節點為頭結點的子樹在s規則下的每乙個答案,並且最終答案一定在其中。
以本題為例,求解流程可以定成:在整棵二叉樹中,求出每乙個節點為頭結點的子樹的最大搜尋二叉子樹(對任何一棵子樹都求出答案),並且最終答案(整棵二叉樹的最大搜尋二叉子樹)一定在其中。
樹形dp套路第一步:以某個節點x為頭結點的子樹中,分析答案有哪些可能性,並且這種分析是以x的左子樹、x的右子樹和x整棵樹的角度來考慮可能性的。
以本題舉例,包含三種可能性。概括而言,最大搜尋二叉子樹可能來自左子樹或右子樹,或者是用x連起左子樹和右子樹所構成的整體。
樹形dp套路第二步:根據第一步的可能性分析,列出所有需要的資訊。
以本題舉例,左樹上需要的資訊為leftmaxbsthead、leftbstsize、leftmax;右樹上需要的資訊為rightmaxbsthead、rightbstsize、rightmin。
樹形dp套路第三步,合併第二步的資訊,對左樹和右樹提出同樣的要求,並寫出資訊結構。
以本題舉例,合併成包含maxbsthead、maxbstsize、max和min的returntype類。需要通過它們來判斷第一步中的三種可能性。
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左右節點符合,則總數相加後,返回此根節點 否則返回左右節點中節點數最多的節點。輸入...