求二叉樹中節點間的寬度

2022-10-10 18:24:08 字數 1783 閱讀 2959

如下圖所示的一棵二叉樹的深度、寬度及結點間距離分別為:

深度:4 寬度:4(同一層最多結點個數)

結點間距離: ⑧→⑥為8 (3×2+2=8)

⑥→⑦為3 (1×2+1=3)

注:結點間距離的定義:由結點向根方向(上行方向)時的邊數×2,

與由根向葉結點方向(下行方向)時的邊數之和。

輸入檔案第一行為乙個整數n(1≤n≤100),表示二叉樹結點個數。接下來的n-1行,表示從結點x到結點y(約定根結點為1)

最後一行兩個整數u、v,表示求從結點u到結點v的距離。

三個數,每個數占一行,依次表示給定二叉樹的深度、寬度及結點u到結點v間距離。

可以先把這道題分解成3個小問題:

1:求二叉樹的深度

每乙個子結點的深度都是它父親節點的深度+1(一號結點的深度是1)

for(int i = 1;i < n;i++)

int max_depth = 1; //

用於記錄深度

for(int i = 1;i <= n;i++)

2:求二叉樹的寬度

int max_width = 1

;for(int i = 1;i <= n;i++)

3:求給定兩個結點間距離求兩個結點的最近公共祖先 lca

int lca(int x,int

y)

else

if(depth[x] ==depth[y])

else

if(depth[x]

else

}

完整**:

#include#include

#include

#include

#include

using

namespace

std;

intn;

int fa[101],root[101],son[101

];int depth[101],width[101

];int lca(int x,int

y)

else

if(depth[x] ==depth[y])

else

if(depth[x]

else

}int

main()

intx,y;

cin >> x >>y;

int max_depth = 1

;

for(int i = 1;i <= n;i++)

cout

<< max_depth <

int max_width = 1

;

for(int i = 1;i <= n;i++)

cout

<< max_width <

int k = lca(x,y); //

求 lca 的結點序號,記錄最小公共祖先

cout << (depth[x] - depth[k]) * 2 + depth[y] - depth[k]; //

求距離return0;

}

求二叉樹寬度

題目 乙個二叉樹採用二叉鍊錶儲存,設計乙個函式計算這個二叉樹的寬度 解題思路 採用層次遍歷,將每乙個結點的資訊儲存在陣列中,結點的資訊包括這個結點的層數,以及結點的左右子樹,資料型別 為char型字元 然後對這個陣列進行遍歷,層號數目最多的即為該二叉樹最大寬度處的層號,然後計算這個層號的數目,即為最...

二叉樹系列五 求二叉樹的寬度

二叉樹的寬度是指二叉樹各層結點個數的最大值。求二叉樹的寬度可以依據與二叉樹的層次遍歷,我們知道,二叉樹的層次遍歷借助於deque實現,每次列印當前結點後將其左子樹右子樹入隊,此時佇列中既包含當前層的結點,也包含下一層的結點,若我們將當前層的結點全部出隊,剩餘的就是下一層的結點個數。所以,我們可以使用...

求二叉樹的深度和寬度

求二叉樹的深度和寬度.cpp 定義控制台應用程式的入口點。include stdafx.h include include using namespace std struct btnode 先序建立二叉樹 void creatbtree btnode root else 求二叉樹的深度 int g...