543 二叉樹的直徑

2022-08-11 23:21:23 字數 1185 閱讀 7160

題目描述:

給定一棵二叉樹,你需要計算它的直徑長度。一棵二叉樹的直徑長度是任意兩個結點路徑長度中的最大值。這條路徑可能穿過也可能不穿過根結點。

示例 :

給定二叉樹

返回 3, 它的長度是路徑 [4,2,1,3] 或者 [5,2,1,3]。

注意:兩結點之間的路徑長度是以它們之間邊的數目表示。

思想:深度優先搜尋

首先我們知道一條路徑的長度為該路徑經過的節點數減一,所以求直徑(即求路徑長度的最大值)等效於求路徑經過節點數的最大值減一。

而任意一條路徑均可以被看作由某個節點為起點,從其左兒子和右兒子向下遍歷的路徑拼接得到。

如圖我們可以知道路徑 [9, 4, 2, 5, 7, 8] 可以被看作以 22 為起點,從其左兒子向下遍歷的路徑 [2, 4, 9] 和從其右兒子向下遍歷的路徑 [2, 5, 7, 8] 拼接得到。

假設知道對於該節點的左兒子向下遍歷經過最多的節點數 l (即以左兒子為根的子樹的深度) 和其右兒子向下遍歷經過最多的節點數 r(即以右兒子為根的子樹的深度),那麼以該節點為起點的路徑經過節點數的最大值即為 l+r+1 。

記節點node 為起點的路徑經過節點數的最大值為 d_node,那麼二叉樹的直徑就是所有節點d_node的最大值減一。

最後的演算法流程為:我們定義乙個遞迴函式 depth(node) 計算 d_node,函式返回該節點為根的子樹的深度。先遞迴呼叫左兒子和右兒子求得它們為根的子樹的深度 l 和 r ,則該節點為根的子樹的深度即為max(l,r)+1該節點的 d_node值為l+r+1,遞迴搜尋每個節點並設乙個全域性變數 ans 記錄d_node的最大值,最後返回 ans-1 即為樹的直徑。

**:

/*

* * definition for a binary tree node.

* struct treenode

* }; */

class

solution

public

:

int diameterofbinarytree(treenode*root)

};

複雜度:

543 二叉樹的直徑

一種比較好的思路是。隨便找乙個點 一般取根節點 找到這棵樹中,距離這個點最遠的點,再從找到的這個點開始,找到距離它最遠的點。這種思路是帶有很強烈的數學成分。證明可自行解決。b站大佬是用動歸來做的,我不是很好理解。這裡給出一種基礎做法,即借助求二叉樹的深度的方式。對於每乙個節點,求其左右子樹的最大深度...

543 二叉樹的直徑

給定一棵二叉樹,你需要計算它的直徑長度。一棵二叉樹的直徑長度是任意兩個結點路徑長度中的最大值。這條路徑可能穿過根結點。示例 給定二叉樹 1 2 3 4 5返回3,它的長度是路徑 4,2,1,3 或者 5,2,1,3 注意 兩結點之間的路徑長度是以它們之間邊的數目表示。分析 考慮分治法。先求某節點到其...

543 二叉樹的直徑

給定一棵二叉樹,你需要計算它的直徑長度。一棵二叉樹的直徑長度是任意兩個結點路徑長度中的最大值。這條路徑可能穿過根結點。示例 給定二叉樹 1 2 3 4 5返回3,它的長度是路徑 4,2,1,3 或者 5,2,1,3 注意 兩結點之間的路徑長度是以它們之間邊的數目表示。class solution o...