小小c 演算法題 10 求樹的深度

2022-03-22 06:45:29 字數 2541 閱讀 4311

樹型結構是一類重要的非線性資料結構,樹是以分支關係定義的層次結構,是n(n>=0)個結點的有限集。關於樹的基本概念不再作過多陳述,相信大家都有了解,如有遺忘,可翻書或去其他網頁瀏覽以溫習。

樹中結點的最大層次數稱為樹的深度(depth)或高度。

本文中以

二叉樹為例來講述求樹的深度的演算法。

在演算法開始之前,我們要有資料,即一棵樹,樹又是結點的集合。所以,應該先定義結點的資料結構(結點的基本屬性和操作),然後再定義樹的資料結構(樹的基本屬性和操作)。本文的重點不是講如何去建立樹的資料結構,所以一切從簡,本文只是簡單構造了結點的資料結構,建立一些結點,然後把這些結點按照邏輯關係關聯起來,組成一棵樹。而並沒有專門去構造樹的資料結構,如果要構造樹的資料結構,應該有新增結點(insertchild)的方法,求樹的深度也應該作為樹的乙個方法存在。

下面是結點的類的定義:

class

node

public

node leftchild

public

node rightchild

}

接下來我們就可以定義一系列的結點,設定左右孩子結點形成分支結構的一棵樹。下面是main方法中的**:

static

void main(string

args)

;node level21 = new node() ;

node level22 = new node() ;

node level31 = new node() ;

node level32 = new node() ;

node level33 = new node() ;

node level41 = new node() ;

root.leftchild =level21;

root.rightchild =level22;

level21.leftchild =level31;

level22.leftchild =level32;

level22.rightchild =level33;

level32.rightchild =level41;

//求樹的深度

//int treedepth = gettreedepth(root);

//遞迴求解

int treedepth = gettreedepthbyloop(root); //

非遞迴求解

console.writeline(treedepth);

console.readkey();

}

通過以上**,我們構成了如下的一棵樹:

可以看出,這棵樹的深度是4。下面就來討論求樹的深度的演算法。

1.遞迴求解:

採用遞迴可以

把乙個大型複雜的問題層層轉化為乙個與原問題相似的規模較小的問題來求解

。拿上面生成的樹來說,如果要求其深度,那麼只要取其左子樹(以2為根結點的子樹)和右子樹(以3為根結點的子樹)

深度的最大值,然後加1即可。由此遞迴處理下去,直到一棵樹只有乙個根結點的時候,可知其深度為1,這裡是遞迴的邊界條件,這時可以返回上一層的遞迴。

下面是**:

private

static

intgettreedepth(node root)

else

else}}

想不通的同學可以拿上面建立好的樹來手動地走一遍。

2.直接求解:

直接求解的思想也十分簡單,我們可以稱之為廣度優先遍歷。從根結點開始,得到其所有孩子結點,放到乙個集合a中,這個集合a中即第二層(根結點為第一層)的所有結點。如果這個集合a不為空,說明其深度至少為2,這時,我們把記錄樹的深度的變數加1,由初始的1變為2。然後我們遍歷這個集合a中的所有結點,即遍歷樹的第二層的結點,同時把第二層中所有結點的子結點放到另外乙個集合b中,這樣,另外乙個集合b中存放的就是第三層的結點。如果集合b不為空,那麼記錄深度的變數再加1。這時清空集合a,準備存放下一層的結點,如此迴圈下去,其間集合a,b交替使用,乙個用來存放正在遍歷的結點,乙個存放下一次要遍歷的孩子結點,直到當某一層的結點數為0時,說明已經到樹的最底層,可以退出迴圈了,記錄深度的變數此時的值就是樹的深度。

**如下:

//

迴圈實現,廣度優先遍歷

private

static

intgettreedepthbyloop(node root)

if (n.rightchild != null

)

}if (nodes2.count > 0) depth++;

else

return

depth;

nodes1.clear();

temp =nodes1;

nodes1 =nodes2;

nodes2 =temp;}}

}

關於main方法中呼叫上述兩種方法的**,在給出建立樹的**時已經一併給出。

樹 10 求最小深度

111.二叉樹的最小深度 隨想錄 給定乙個二叉樹,找出其最小深度。最小深度是從根節點到最近葉子節點的最短路徑上的節點數量。說明 葉子節點是指沒有子節點的節點。示例 給定二叉樹 3,9,20,null,null,15,7 3 9 20 15 7返回它的最小深度 2.遞迴 definition for ...

求樹的深度

輸入一棵二元樹的根結點,求該樹的深度。從根結點到葉結點依次經過的結點 含根 葉結點 形成樹的一條路徑,最長路徑的長度為樹的深度。例如 輸入二元樹 10 6 14 4 12 16輸出該樹的深度3。實現簡單的乙個查詢二叉樹的深度的函式。int gettreeheight tnode root int l...

求樹的深度

1.以孩子兄弟鍊錶作為儲存結構 資料結構 typedef struct csnodecsnode,cstree 演算法 int depth cstree t return m 1 子樹的最大深度加上根節點的深度 2.利用層次遍歷,還是用上述資料結構 演算法思想 利用佇列,將節點按層次順序入隊,出隊,...