平衡二叉樹的判斷,對二叉樹遞迴的深入一步理解

2021-10-18 14:31:52 字數 1721 閱讀 9354

平衡二叉樹,就是指二叉樹中每個節點其左右孩子子樹的高度,不能超過1。

二叉樹最基本的遍歷,前中後序遍歷,最簡單的就是用遞迴實現。

再次看二叉樹的遞迴過程,可以看到,其實,每個節點都被掃瞄了三次:

第一次,從根節點是向下遞迴的時候,掃瞄到了。

第二次,當左孩子子樹遞迴返回時,掃瞄到了。

第三次,當右孩子子樹遞迴返回時,掃瞄到了。

二叉樹遞迴過程的第二個理解,就是,遞迴本身就是分而治之的思想,因此,每乙個節點,都是要重複以上三步的,先是本身掃瞄,然後,左孩子返回,右孩子返回。

因此,遞迴過程,就是每乙個節點都執行相同的過程,因此,我們可以直接只考慮乙個節點的細節,就能推出整個遞迴。在這個過程中,每個節點需要接收子樹返回的相同的資料結構,同時向上返回相同的資料結構。

因此,二叉樹的遞迴過程,需要我們設計的地方,就是這個資料結構,這個資料結構,就是每個節點能從下面遞迴返回時拿到的資料,和向上返回時的資料。

這個資料結構需要能滿足所有運算過程。

然後我們只需要著眼於乙個節點的那三次被掃瞄時,拿到的資料和向上返回的資料,遞迴過程就能輕鬆被設計出來。

一、先巨集觀分析題目要求,完成題目要求需要什麼資料。

二、設計遞迴傳遞的資料結構。

三、著眼於乙個具體節點,仔細分析三次掃瞄時,需要的具體資料,只要乙個節點能實現接收資料並返回上級,整個遞迴就實現了。

一、先巨集觀分析題目要求,完成題目要求需要什麼資料。

判斷乙個樹是否是平衡二叉樹,那麼,就需要每個節點的左右孩子子樹的高度,同時,還需要每個孩子子樹本身是否是平衡二叉樹,因為題目要求就是只要有乙個不是平衡的,整棵樹就不是平衡的。

二、設計遞迴傳遞的資料結構。

isb:左右子樹是否平衡

height:左右子樹的高度

public

class

returndata

}

三、著眼於乙個具體節點,仔細分析三次掃瞄時,需要的具體資料,只要乙個節點能實現接收資料並返回上級,整個遞迴就實現了。

分析一下,判斷平衡二叉樹的資料,都是從子樹來的,因此,第一次掃瞄其實沒啥用,不需要什麼操作。但是,也不是所有遞迴第一次掃瞄都不需要,比如前序遍歷時,節點第一次被遍歷到,就要列印。

那麼此時著眼於乙個具體節點,拿到乙個具體節點。第二次和第三次掃瞄時,能從子樹那裡拿到子樹的高度,和子樹是否是平衡二叉樹。先判斷本身是否為空,然後判斷子樹是否是平衡二叉樹,如果不是,直接繼續向上返回不是,否則,判斷左右子樹高度差是否大於1,然後繼續向上返回就行了。

**:

public

static

boolean

isb(treenode node)

public

static returndata process

(treenode node)

returndata left =

process

(node.left);if

(!left.isb)

returndata right =

process

(node.right);if

(!right.isb)

if(math.

abs(left.height-right.height)

>1)

else

}

二叉樹 平衡二叉樹

1.題目 給定乙個二叉樹,判斷這棵二叉樹是否是高度平衡的二叉樹 平衡二叉樹 乙個二叉樹每個節點 的左右兩個子樹的高度差的絕對值不超過1 2.題目分析 1 如果乙個節點的兩個子樹的深度之差超過1,則不是平衡二叉樹 2 如果乙個節點的兩個子樹的深度之差不超過1,則是平衡二叉樹 3.程式分析 1 若這棵二...

平衡二叉樹例題 平衡二叉樹

acwing 72.平衡二叉樹 思路一 求每個節點的左右子樹深度,根據深度差判斷,直到葉子節點結束,效率不夠高,每個節點都要用兩次計算深度的遞迴函式 思路二 從葉子節點開始,計算深度差,一旦有深度差大於1的,就直接返回0,也不用管上面的深度是不是正確了,畢竟我們只需要true和false兩種狀態,省...

判斷平衡二叉樹

演算法 樹 平衡二叉樹 平衡二叉樹的概念 左右節點的樹高之差小於1。1.計算節點的高。通過遞迴,求出左右子樹的高度,當前節點的高度,最大的那乙個 1。int getheight treenode root 2.通過遞迴的方法計算左子樹和右子樹的樹高之差是否有小於1的,有就直接返回false.publ...