1501 二叉樹最大寬度和高度


1501 二叉樹最大寬度和高度

 

 時間限制: 1 s
 空間限制: 128000 KB
 題目等級 : 白銀 Silver
 
 
題目描述  Description

    給出一個二叉樹,輸出它的最大寬度和高度。

輸入描述  Input Description

第一行一個整數n。

下面n行每行有兩個數,對於第i行的兩個數,代表編號為i的節點所連接的兩個左右兒子的編號。如果沒有某個兒子為空,則為0。

輸出描述  Output Description

輸出共一行,輸出二叉樹的最大寬度和高度,用一個空格隔開。

樣例輸入  Sample Input

5

2 3

4 5

0 0

0 0

0 0

樣例輸出  Sample Output

2 3

數據范圍及提示  Data Size & Hint

n<16

默認第一個是根節點

以輸入的次序為編號

2-N+1行指的是這個節點的左孩子和右孩子

注意:第二題有極端數據!

          1

          0 0

這題你們別想投機取巧了,給我老老實實搜索!

 

分類標簽 Tags 

#include<cstdio>
#include<iostream>
using namespace std;
int a[30][3],b[30];
int main(){
    int n,x,y,k,wide=0,deep=0;
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        scanf("%d%d",&x,&y);
        a[i][0]=x;a[i][1]=y;//儲存左右孩子 
        a[x][2]=i;a[y][2]=i;//儲存其父節點    
    }
    for(int i=1;i<=n;i++){
        k=1;
        x=a[i][2];
        while(x!=0){
            k++;
            x=a[x][2];
        }
        b[k]++;
        if(k>deep) deep=k;
        if(b[k]>wide) wide=b[k];    
    }
    printf("%d %d\n",wide,deep);
    //wide--最下一層的寬度(上一層的某節點最多有幾個孩子);deep--深度 
    return 0;
}

復習二叉樹

 

一般的樹都可以轉換為二叉樹,且二叉樹的存儲結構及操作都較為簡單,因此先介紹下樹中的二叉樹類型。

二叉樹是n個結點的有限集,它或者是空集(n=0),或者有一個根結點及最多兩棵互不相交的,分別稱作這個根的左子樹和右子樹的二叉樹組成。

二叉樹有五種基本形態:(1)空集(2)根的左右子樹都為空(3)根的右子樹為空(4)根的左子樹為空(5)根的左右子樹皆不為空。

二叉樹的邏輯結構:

二叉樹與無序樹不同,二叉樹中,每個結點最多只能有兩棵子樹,並且無左右之分。另外,二叉樹與度數為2的有序樹不同,在有序樹中,雖然一個極點的孩子之間是有左右次序的,但若該結點只有一個孩子,就無須區分其左右次序;而二叉樹中,即使是一個孩子也有左右之分。所以,二叉樹不是樹的特殊情形。

二叉樹的特殊性質(在此不證明):

(1)二叉樹第i層上的結點數目最多為2i-1(i>=1);

 (2)深度為k的二叉樹至多有2k-1個結點(k>=1);

 (3)在任意一顆二叉樹中,若終端結點的個數為n0,度為2的結點數為n2,則n0=n2+1

 完全二叉樹:若二叉樹的高度為h,除第h層外,其他各層(1-h-1)的結點數都達到最大個數,並且最下一層上的結點都集中在該層最左邊的若干位置上,則此二叉樹被稱為完全二叉樹。

 滿二叉樹:一顆深度為k且有2k-1個結點的二叉樹稱為滿二叉樹。

 還有很多性質,在這不在多討論。可以參考其他書籍。

順序存儲結構實現的主要思想:將一般二叉樹填上一些空結點,使之成為“完全二叉樹”,並且按完全二叉樹形式給結點編號。其中的空結點便是順序存儲過程中浪費的空間。

 

參考:http://www.360doc.com/content/13/0422/18/3777348_280168665.shtml

http://www.jb51.net/article/37334.htm


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM