3 二叉哥的二叉樹

2021-09-02 22:08:11 字數 1230 閱讀 3883

題目描述

傳說計算機學院有一位前輩叫做二叉哥,他十八般演算法樣樣精通。他當年在程設的時候由於二叉樹一舉成名。大家為了紀念這一事件,尊稱他為二叉哥!二叉樹是乙個什麼樣的東西呢?現在我們就來揭開二叉哥的二叉樹的神秘面紗吧!

下圖就是一棵有著9個節點的二叉樹。顧名思義,二叉樹就像一棵倒著生長的樹,每個分叉點可以分出去兩個枝條。我們把分叉點叫做"節點」,因為每個分叉點最多可以分出去兩個枝條,所以就叫做"二叉」樹。最頂層只有乙個節點,我們把它叫做根節點。下圖中,標號為1的節點就是根節點,它有兩個孩子:節點2和節點3。節點2只有乙個孩子,標號為4,而節點3有兩個孩子,標號分別為5和6。下圖中的二叉樹第3層有3個節點,分別是7、8和9號節點。

二叉哥對於二叉樹的掌握已經到了出神入化的程度,為了維護他的二叉樹霸主地位,他準備了2^2^2^2^2個問題來迎接挑戰者,現在我們來看下第0道吧。

乙個有n個節點的二叉樹的第m層至多有多少個節點?

輸入

輸入的第一行為乙個數字t(1 <= t <= 10000),表示有t組資料。

接下來的t行每行有兩個數字n和m(0 <= n, m <= 10^8),表示二叉樹有n個節點,求m層最多有多少個節點。

根節點所在的為第0層。

輸出

每個用例輸出乙個數字,表示最多的節點個數。

#include "stdio.h"

#include "stdlib.h"

#include "math.h"

int n, m;

int list[40];

int result;

void build(int n, int m)

if(m == 0)

return;

}if(n >= list[m]+1)

int maxd = (int)(log(n+1)/log(2))-1;

while(maxd > m||n-list[maxd+1]+1 < m-maxd)

result += list[maxd];

if(maxd == m) return;

build(n-list[maxd+1]+1-m+maxd, maxd);

}int main()

int t;

scanf("%d",&t);

while(t--)

return 0;

}

二叉樹3(恢復二叉樹)

給一顆帶權 權值各不相同,都是小於10000的正整數 的二叉樹的中序和後序遍歷序列,找乙個葉子使得它到根的路徑上的權值盡可能小,如果有多解,取葉子權值小的。輸入中第一行為中序遍歷,第二行為後序遍歷。例如輸入 3 2 1 4 5 7 6 3 1 2 5 6 7 4 輸出輸入 7 8 11 3 5 16...

二叉樹 二叉樹

題目描述 如上所示,由正整數1,2,3 組成了一顆特殊二叉樹。我們已知這個二叉樹的最後乙個結點是n。現在的問題是,結點m所在的子樹中一共包括多少個結點。比如,n 12,m 3那麼上圖中的結點13,14,15以及後面的結點都是不存在的,結點m所在子樹中包括的結點有3,6,7,12,因此結點m的所在子樹...

樹 二叉樹 滿二叉樹 完全二叉樹 完滿二叉樹

目錄名稱作用根 樹的頂端結點 孩子當遠離根 root 的時候,直接連線到另外乙個結點的結點被稱之為孩子 child 雙親相應地,另外乙個結點稱為孩子 child 的雙親 parent 兄弟具有同乙個雙親 parent 的孩子 child 之間互稱為兄弟 sibling 祖先結點的祖先 ancesto...