如下圖所示的一棵二叉樹的深度、寬度及結點間距離分別為:
深度: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++)2:求二叉樹的寬度int max_depth = 1; //
用於記錄深度
for(int i = 1;i <= n;i++)
int max_width = 13:求給定兩個結點間距離求兩個結點的最近公共祖先 lca;for(int i = 1;i <= n;i++)
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...