1. 程式人生 > >挑戰程式設計競賽 演算法和資料結構 第8章 樹

挑戰程式設計競賽 演算法和資料結構 第8章 樹

//ALDS1_7_B Binary Trees
#include <stdio.h>
#include <string.h>
struct node{
    int parent,left,right;
}T[30];
int H[30],D[30];//H[]高度 D[]深度
int setHeight(int u){
    int h1=0,h2=0;//2此處寫成 int h1,h2;
    if(T[u].left!=-1)
        h1=setHeight(T[u].left)+1;
    if(T[u].right!=-1)
        h2=setHeight(T[u].right)+1;//1此處寫成 h2=setHeight(T[u].right+1);
    return H[u]=h1>h2?h1:h2;
}
void setDepth(int u,int d){
    D[u]=d;
    if(T[u].left!=-1)setDepth(T[u].left,d+1);
    if(T[u].right!=-1)setDepth(T[u].right,d+1);
}
void print(int u){
    int deg=0;
    printf("node %d: parent = %d, ",u,T[u].parent);
    printf("sibling = ");
    if(T[u].parent==-1)printf("-1, ");//4 添上改行 就因為少了該句,除錯程式1個小時
    else if(T[T[u].parent].left!=-1&&T[T[u].parent].left!=u)
        printf("%d, ",T[T[u].parent].left);
    else if(T[T[u].parent].right!=-1&&T[T[u].parent].right!=u)
        printf("%d, ",T[T[u].parent].right);
    else
        printf("-1, ");
    if(T[u].left!=-1)deg++;
    if(T[u].right!=-1)deg++;
    printf("degree = %d, ",deg);
    printf("depth = %d, ",D[u]);
    printf("height = %d, ",H[u]);
    if(T[u].parent==-1)printf("root\n");
    else if(T[u].left==-1&&T[u].right==-1)printf("leaf\n");
    else printf("internal node\n");
}
int main(){
    int n,i,root=0,v,l,r;
    memset(T,-1,sizeof(T));
    scanf("%d",&n);
    for(i=0;i<n;i++){
        scanf("%d%d%d",&v,&l,&r);
        if(l!=-1){T[v].left=l,T[l].parent=v;}
        if(r!=-1){T[v].right=r,T[r].parent=v;}
    }
    for(i=0;i<n;i++)
        if(T[i].parent==-1){
            root=i;
            break;
        }
    setHeight(root);
    setDepth(root,0);
    for(i=0;i<n;i++)
        print(i);
    return 0;
}
原書程式問題,陣列開得太大,題目中約束0<=n<=25。

相關推薦

挑戰程式設計競賽 演算法資料結構 8

//ALDS1_7_B Binary Trees #include <stdio.h> #include <string.h> struct node{     int parent,left,right; }T[30]; int H[30],D[30];//H[]高度 D[]深度

挑戰程式設計競賽 演算法資料結構 6 遞迴分治法

仿照上述程式碼,本人編寫的C語言AC程式碼如下: //ALDS1_5_C:Koch Curve //2一個很致命的問題,將遞迴中的 s,t;區域性變數寫成全域性變數 //深刻感覺遞迴,還需要時間的積累。2017-9-29 AC #include <stdio.h> #include <ma

程式設計靈魂---演算法資料結構

     做程式開發工作很長時間了,隨著自己知識的提升,逐漸的感覺到程式設計中,最重要的是演算法和數結構。語言是載體而以,如果你精通了一門語言,學習其他語言都是很簡單了。例如C++ 和JAVA 就有很多一樣的地方,相互之間可以對比學習。     程式設計中的很多問題最後歸根到

資料結構——二叉:02二叉

1.二叉樹的儲存結構: (1)二叉樹的順序儲存表示: #define MAX_TREE_SIZE 100 //二叉樹的最大結點數 typedef TElemType SqBiTree[MAX_TREE_SIZE];  SqBiTree bt; (2)二叉樹的鏈式儲存表示: ①二叉連結

資料結構——二叉:03森林

1.樹的三種儲存結構: (1)雙親表示法: #define MAX_TREE_SIZE 100 結點結構: typedef struct PTNode {   Elem data;   int parent; //雙親位置域 } PTNode; (2)孩子雙親連結串列表示法: &nbs

淺談演算法資料結構: 八 平衡查詢之2-3

前面介紹了二叉查詢樹(Binary Search Tree),他對於大多數情況下的查詢和插入在效率上來說是沒有問題的,但是他在最差的情況下效率比較低。本文及後面文章介紹的平衡查詢樹的資料結構能夠保證在最差的情況下也能達到lgN的效率,要實現這一目標我們需要保證樹在插入完成之後

淺談演算法資料結構: 九 平衡查詢之紅黑

前面一篇文章介紹了2-3查詢樹,可以看到,2-3查詢樹能保證在插入元素之後能保持樹的平衡狀態,最壞情況下即所有的子節點都是2-node,樹的高度為lgN,從而保證了最壞情況下的時間複雜度。但是2-3樹實現起來比較複雜,本文介紹一種簡單實現2-3樹的資料結構,即紅黑樹(

淺談演算法資料結構: 十 平衡查詢之B

前面講解了平衡查詢樹中的2-3樹以及其實現紅黑樹。2-3樹種,一個節點最多有2個key,而紅黑樹則使用染色的方式來標識這兩個key。 維基百科對B樹的定義為“在電腦科學中,B樹(B-tree)是一種樹狀資料結構,它能夠儲存資料、對其進行排序並允許以O(log n)的時間複雜度執行進行查詢、順序讀取、插入和刪

演算法資料結構】平衡查詢之B

  以B-樹的效能總是等價於二分查詢(與M值無關),也就沒有B樹平衡的問題;由於M/2的限制,在插入結點時,如果結點已滿,需要將結點分裂為兩個各佔M/2的結點;刪除結點時,需將兩個不足M/2的兄弟結點合併。 下面簡單說明分裂:    下面對B-樹進行實現 #pragma once //3階B樹 tem

資訊學奧賽一本通(C++版) 三部分 資料結構

//1336 【例3-1】找樹根和孩子 //提交,未通過,明白了,孩子必須按字典序輸出 //修改,提交,AC 2017-12-13 18:54 //該題思路可以預計,與書中提供的程式碼很不相同,書中猜測用的是左子右兄表示法,日後驗證 //該題,本人思路,鄰接表,有向圖. //很明顯,水平上了一個臺階。 #i

挑戰程式設計競賽2 演算法資料結構 讀後感

介紹 本篇主要是講《挑戰程式設計競賽2 演算法和資料結構》書的讀後感和部分題目的再次解讀、程式設計。包括書中的部分程式碼和一些個人的見解。如果想深入瞭解,建議去網上買一本回來看,比較適合學習演算法的初學者。 章節 第一章 第一章主要

查詢演算法 淺談演算法資料結構: 七 二叉查詢 淺談演算法資料結構: 十一 雜湊表

閱讀目錄 1. 順序查詢 2. 二分查詢 3. 插值查詢 4. 斐波那契查詢 5. 樹表查詢 6. 分塊查詢 7. 雜湊查詢   查詢是在大量的資訊中尋找一個特定的資訊元素,在計算機應用中,查詢是常用的基本運算,例如編譯程式中符號表的查詢。本文

玩轉資料結構——:連結串列遞迴

內容概要: Leetcode中和連結串列相關的問題 測試自己的Leetcode連結串列程式碼 遞迴繼承與遞迴的巨集觀語意 連結串列的天然遞迴結構性質 遞迴執行機制:遞迴的微觀解讀 遞迴演算法的除錯 更多和連結串列相關的問題 1-Leetcode中

淺談演算法資料結構: 五 優先順序佇列與堆排序

在很多應用中,我們通常需要按照優先順序情況對待處理物件進行處理,比如首先處理優先順序最高的物件,然後處理次高的物件。最簡單的一個例子就是,在手機上玩遊戲的時候,如果有來電,那麼系統應該優先處理打進來的電話。 在這種情況下,我們的資料結構應該提供兩個最基本的操作,一個是返回最高優先

拒絕調包俠,不需要高階演算法資料結構技巧

前言 大多數工科學生或者剛剛入門近年來比較火的“人工智慧”相關演算法的同學,在選擇語言的時候,都會選擇MATLAB、Python、R等等這些高階語言,對自己所學的演算法進行實現和除錯。這些高階語言中,包含了實現複雜演算法的基礎數學演算法、基本統計演算法、基礎資料結構的實現,比如均值(mean)、方差(std

java中各種演算法資料結構的使用場景

一。通用資料結構:陣列,連結串列,樹,雜湊表 通用資料結構通過關鍵字的值來儲存並查詢資料,如報表,合同,記錄,業績等資料。通用資料結構可以用速度的快慢來分類,陣列和連結串列是最慢的,樹相對較快,雜湊表是最快的。請注意,並不是最快的就一定是最好的,因為最快的結構的

玩轉資料結構——:集合對映

集合(Set) 什麼是集合? 集合是承載元素的容器; 特點:每個元素只能存在一次 優點:去重 二分搜尋樹的新增操作add:不能盛放重複元素 是非常好的實現“集合”的底層資料結構 /** * 集合的介面 */ public interface Set<

玩轉資料結構——:優先佇列

內容概要: 什麼是優先佇列? 堆的基礎結構 向堆中新增元素Sift Up 從堆中取出元素和Sift Down Heapify和Replace 基於堆的優先佇列 LeetCode上優先佇列相關的問題 java中的PriorityQueue 和堆相關的更多話題和

演算法資料結構

資料結構 堆 長度為n的陣列構建成最小堆的時間複雜度 B、B+樹、紅黑樹 說一下B+樹和二叉搜尋樹的區別? 說一下二叉搜尋樹和AVL樹、紅黑樹之間的差別 說下紅黑樹原理,紅黑樹你看虛擬碼的時候他有兩坨比較一樣的有沒有注意過 哪些情況下用棧 知道雜湊嗎?二叉樹比

演算法資料結構單鏈表的逆轉

public void reverse(SinglyList<T> list) { Node<T> p = list.head.next, succ = null, front = null; while (p != null) {