二叉樹的子樹 解題報告

2021-08-08 12:48:15 字數 1302 閱讀 5496

time limit:3000ms  memory limit:65536k

description

如上圖所示,由正整數1,2,3……組成了一顆二叉樹。我們已知這個二叉樹的最後乙個結點是n。現在的問題是,結點m所在的子樹中一共包括多少個結點。

比如,n = 12,m = 3那麼上圖中的結點13,14,15以及後面的結點都是不存在的,結點m所在子樹中包括的結點有3,6,7,12,因此結點m的所在子樹中共有4個結點。

input

輸入資料報括多行,每行給出一組測試資料,包括兩個整數m,n (1 <= m <= n <= 1000000000)。最後一組測試資料中包括兩個0,表示輸入的結束,這組資料不用處理。

output

對於每一組測試資料,輸出一行,該行包含乙個整數,給出結點m所在子樹中包括的結點的數目。

sample input

3 12

0 0sample output

hint

這一題如果從查詢的點出發往下遍歷它的左子樹和右子樹,是肯定會超時的,因此不應遍歷每個點,而是逐層遍歷。

以樣例為例,從3出發逐層向下遍歷,每次找它的右兒子結點,即3*2+1,以此類推找到每個當前點編號i的編號i*2+1點,直到i*2+1>n;這樣就相當於把所有滿結點的層遍歷完了。

那麼這些層包含了多少點呢?排除最後一層抽出來看其實它是一棵完全二叉樹,假如有i層,它的點數為2的i-1次方-1,而層數可以通過遍歷時求出;至於最後一層的結點,可以再回到m進行遍歷,找到它最左方的葉子結點k,那麼最後一層的結點數就為n-k+1.當然,如果n**:

#include

#include

using namespace std;

int n,m;

int main()

m1*=int(pow(double(2),i-1));

if (m1*2>n) printf("%d\n",ans); else printf("%d\n",ans+n-m1*2+1);

}}#include

using namespace std;

int n,m;

int main()

m1*=int(pow(double(2),i-1));

if (m1*2>n) printf("%d\n",ans); else printf("%d\n",ans+n-m1*2+1);

}}

二叉樹子樹的刪除

package 二叉樹子樹的刪除 public class binarytree public treenode getroot 前序 public void frontshow else 中序 public void midshow else 後序 public void aftershow el...

二叉樹和最大的子樹

問題描述 給乙個二叉樹,每個節點都是正或負整數,如何找到乙個子樹,它所有節點的和最大?思路 採用自底向上的計算。先計算左右子樹總和值,用左右子樹的總和加上當前節點值,如果當前總和大於最大值,則更新最大值,同時將最大子樹根節點更新為當前根。簡單說,就是後序遍歷。cpp view plain copy ...

演算法 二叉樹解題

給定乙個二叉樹,從左向右地,自底向上的遍歷每一層的元素。例 給定二叉樹 3 9 20 15 7 返回的結果 15,7 9,20 3 首先,要有乙個概念,無論是樹的題目還是圖的題目,解決的方式一般就是dfs或者是bfs,往裡面套就可以了。題目中提到要自底而上,但是這個其實問題不大,只要將自頂而上的列表...