1. 程式人生 > >證明N個節點構成一棵樹的種類數

證明N個節點構成一棵樹的種類數

  
    Cayley公式是說,一個完全圖K_n有n^(n-2)棵生成樹,換句話說n個節點的帶標號的無根樹有n^(n-2)個。今天我學到了Cayley公式的一個非常簡單的證明,證明依賴於Prüfer編碼,它是對帶標號無根樹的一種編碼方式。
    給定一棵帶標號的無根樹,找出編號最小的葉子節點,寫下與它相鄰的節點的編號,然後刪掉這個葉子節點。反覆執行這個操作直到只剩兩個節點為止。由於節點數n>2的樹總存在葉子節點,因此一棵n個節點的無根樹唯一地對應了一個長度為n-2的數列,數列中的每個數都在1到n的範圍內。下面我們只需要說明,任何一個長為n-2、取值範圍在1到n之間的數列都唯一地對應了一棵n個節點的無根樹,這樣我們的帶標號無根樹就和Prüfer編碼之間形成一一對應的關係,Cayley公式便不證自明瞭。

    注意到,如果一個節點A不是葉子節點,那麼它至少有兩條邊;但在上述過程結束後,整個圖只剩下一條邊,因此節點A的至少一個相鄰節點被去掉過,節點A的編號將會在這棵樹對應的Prüfer編碼中出現。反過來,在Prüfer編碼中出現過的數字顯然不可能是這棵樹(初始時)的葉子。於是我們看到,沒有在Prüfer編碼中出現過的數字恰好就是這棵樹(初始時)的葉子節點。找出沒有出現過的數字中最小的那一個(比如④),它就是與Prüfer編碼中第一個數所標識的節點(比如③)相鄰的葉子。接下來,我們遞迴地考慮後面n-3位編碼(別忘了編碼總長是n-2):找出除④以外不在後n-3位編碼中的最小的數(左圖的例子中是⑦),將它連線到整個編碼的第2個數所對應的節點上(例子中還是③)。再接下來,找出除④和⑦以外後n-4位編碼中最小的不被包含的數,做同樣的處理……依次把③⑧②⑤⑥與編碼中第3、4、5、6、7位所表示的節點相連。最後,我們還有①和⑨沒處理過,直接把它們倆連線起來就行了。由於沒處理過的節點數總比剩下的編碼長度大2,因此我們總能找到一個最小的沒在剩餘編碼中出現的數,演算法總能進行下去。這樣,任何一個Prüfer編碼都唯一地對應了一棵無根樹,有多少個n-2位的Prüfer編碼就有多少個帶標號的無根樹。

    一個有趣的推廣是,n個節點的度依次為D1, D2, …, Dn的無根樹共有(n-2)! / [ (D1-1)!(D2-1)!..(Dn-1)! ]個,因為此時Prüfer編碼中的數字i恰好出現Di-1次。

相關推薦

證明N節點構成種類

       Cayley公式是說,一個完全圖K_n有n^(n-2)棵生成樹,換句話說n個節點的帶標號的無根樹有n^(n-2)個。今天我學到了Cayley公式的一個非常簡單的證明,證明依賴於Prüfer編碼,它是對帶標號無根樹的一種編碼方式。     給定一棵帶標號的無根樹,找出編號最小的葉子節點,寫下與它

N節點的二叉有多少種形態(卡特蘭

面試 誤區 樹的定義 節點 類型 基礎 更多 大於等於 證明 這是一道阿裏的面試題。其實算不上新鮮,但是我之前沒關註過,如今碰到了,就順便探討下這個問題吧:) 拿到這個題,首先想到的是直接寫出表達式肯定不行,所以有必要從遞推入手。由特殊到一般,歸納法麽~而且二叉樹離不開遞推

N節點的二叉有多少種形態

先考慮只有一個節點的情形,設此時的形態有f(1)種,那麼很明顯f(1)=1 如果有兩個節點呢?我們很自然想到,應該在f(1)的基礎上考慮遞推關係。那麼,如果固定一個節點後,有兩種情況,一是左子樹還剩一個節點,此刻型別數量為f(1),第二種情況是右子樹生一個節點,此刻型別

使用STL容器構成

//使用STL構成一棵樹#include<vector>    //vector容器#include<iostream>    //輸入輸出using namespace std;const int LEAVES_MAX = 4;  //最大子葉數//樹節點結構struct TreeN

leetcode 刪除連結串列倒數第n節點次掃描)

題目描述 給定一個連結串列,刪除連結串列的倒數第 n 個節點,並且返回連結串列的頭結點。 演算法思想 採用一次掃描的辦法,需要定位到刪除節點的前面的節點 因此指標p往後挪動的個數為n+1次 注意如果p挪動之後,碰到空,說明刪除的是頭結點 使用兩個指標,一個從頭還是挪動,一

具有N節點的二叉有多少種形態,居然有計算公式

具有3個結點的二叉樹有幾種形態? 正確答案: B   你的答案: B (正確) 4 5 6 7 解析 這是一道牛客網上的測試題,因為題目是求3個節點的二叉樹的形態

n節點的二叉的種樹成卡特蘭的分佈

#include <algorithm> #include <iostream> #include <cstdlib> #include <cstring&g

CF E. Vasya and a Tree】 dfs+狀陣列(給你一棵n個節點,每個點有一個權值,初始全為0,m次操作,每次三個數(v, d, x)表示只考慮以v為根的子,將所有與v點距離小於等於d的點權值全部加上x,求所有操作完畢後,所有節點的值)

題意: 給你一棵n個節點的樹,每個點有一個權值,初始全為0,m次操作,每次三個數(v, d, x)表示只考慮以v為根的子樹,將所有與v點距離小於等於d的點權值全部加上x,求所有操作完畢後,所有節點的值   首先要明確兩件事情性質1.每個人的操作只會影響到他的子孫(包括自己) 性質1.每個人的操

hdu6035 Colorful Tree 樹形dp 給定,每個節點有一個顏色值。定義每條路徑的值為經過的節點的不同顏色。求所有路徑的值和。

void 題意 iostream cnblogs 編號 emp php scanf http /** 題目:hdu6035 Colorful Tree 鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=6035 題意:給定一棵樹,每

n節點總共能建立幾種不同的二叉

先考慮只有一個節點的情形,設此時的形態有f(1)種,那麼很明顯f(1)=1 如果有兩個節點呢?我們很自然想到,應該在f(1)的基礎上考慮遞推關係。那麼,如果固定一個節點後,有兩種情況,一是左子樹還剩一個節點,此刻型別數量為f(1),第二種情況是右子樹生一個節點,此刻型別數量為f(1),固有f(2) = f(

給定N節點求組成二叉搜尋個數——從一道演算法題探討神奇的Catalan

引 Catalan數,中文卡特蘭數又稱卡塔蘭數,是組合數學中一個常出現在各種計數問題中的數列。一旦入坑,你會發現這個數列相當有意思,能夠應用於很多看起來特別複雜的計算場景,當然,並能將之迎刃而解。 :卡塔蘭數是組合數學中一個常在各種計數問題中出現的數列

順序二叉,求m下面有多少節點(總共n節點

//用佇列來計算 ,如果m的左孩子節點x滿足<=n,則進入佇列, 如果m的右孩子y<=n,也進入佇列 //然後將x在繼續彈出佇列,看他的左右孩子是否滿足,滿足則還是加入佇列,以此類推,直到佇列為空 //deque的常用操作函式為:c.empty() c.f

怎麼判斷的所有葉子節點都在同一層

給定一棵樹,怎麼判斷它的所有葉子節點都在同一層,這種情況應該是完全二叉樹的一種特例,如下圖: 如果去掉節點6的話,它是一棵完全二叉樹,但是所有的葉子節點不在同一層,下面是層次遍歷的一種方法: #include<iostream> #include<v

遍歷n節點能夠形成的所有二叉

幫師兄做的一個問題,就是求對n個不同節點能夠形成所有的二叉樹的形式,不考慮旋轉對稱性和同構。 問題描述:給定n個節點,檢視能夠有多少種不同的二叉樹形成,並輸出出來 演算法描述:使用最基本的“分治法“(Divide and Conquer)思想,任選一個節點作為根節點,將剩餘

二叉系列---求包含n節點的二叉查詢種類

題目1 求包含n個節點的二叉查詢樹的種類數; 方法1 設dp[i]表示共有i個節點時,能產生的BST樹的個數 n == 0 時,空樹的個數必然為1,因此dp[0] = 1 n == 1 時,只有1這個根節點,數量也為1,因此

【面試題】求包含n節點(從1到nn節點)的所有二叉搜尋

二叉搜尋樹滿足的條件 當前根節點的值大於左子樹節點的值 當前根節點的值小於右子樹節點的值 左右子樹同樣是二叉搜尋樹 根據上述規則可以看出,根節點值不同,形成的二叉搜尋樹就不同,那麼[1:n]範圍內的n個數就有n個不同的選擇。 [1:i−1]這i-1

編寫程式,要求通過次遍歷找到單鏈表中倒數第 n 節點

這是我們實習的第一道題目 1問題描述:要求通過一次遍歷找到單鏈表中倒數第 n 個節點(ps: 不允許使用 雙向連結串列;不允許 修改原始單鏈表;可使用額外的輔助空間,但是輔助空間的數目必須最小,不能和

連結串列遍歷次刪除倒數第N節點

刷 leetcode的 Remove Nth Node From End of List 的題目,一開始想這算是easy的題目了,只需要遍歷一次,記錄n個節點,然後減去倒數的節點數,就得到所要刪除的節點。但是沒注意題目的只遍歷一次。 解決這道題目的主要思路是,設立兩個指標

637. Average of Levels in Binary Tree(每層節點的平均數)(二叉的層序遍歷)

sum i++ 頂點 span static 層遍歷 levels != new Given a non-empty binary tree, return the average value of the nodes on each level in the form o

如何打印(Java)

.get stat color util emp println style ldl 多叉樹 有一棵多叉樹,將它打印出來。 import java.util.LinkedList; /** * 需求:按層打印一棵樹 * 說明:樹是保存在一個鏈表中 *