資料結構 樹

2021-09-27 06:51:29 字數 2873 閱讀 3269

一. 樹的概念

定義:樹是一種非線性的資料結構。由n(n>=0)個節點組成.

1. 節點

它包含資料項,和指向其它節點的指標,上圖中的樹有7個節點。

2.節點的度

有幾個分支,度就是幾

3. 葉節點

度為0的節點被稱為葉節點, 上圖中c、d、f為葉節點

4.分支節點

除了葉節點之外的節點就是分支節點

5. 節點層次

節點所在的層級,如根節點a在第一層

6.樹的深度

樹中距離根節點最遠的節點所處的層次就是樹的深度,如上圖為3

7. 樹的度

樹中節點的度的最大值。 上圖中根節點的度最大,為3

8. 森林

森林是m(m>=0)顆數的集

二.二叉樹

定義:二叉樹是一種特殊情況,每個節點最多有兩個子女,分別為左子女和右子女

二叉樹的性質:

a. 二叉樹的第i(i>=1)層,最多存在2的i-1次方個節點。

b.深度為k(k>=0)的二叉樹,最少有k個節點,最多有2的k-1次方個節點。

c. 對於乙個非空二叉樹,葉節點的數量等於度為2的節點數量加1。

特殊二叉樹:

滿二叉樹: 深度為k的滿二叉樹,是有2的k-1次方個節點的二叉樹,每一層都達到了可以容納的最大數量的節點

完全二叉樹: 深度為k的完全二叉樹,從第一層到第k-1層都是滿的,第k層,或是滿的,或是從右向左連續缺若干個節點

三.code定義二叉樹

// 定義二叉樹節點

class bintreenode

}

遍歷廣義表字串,來建立一顆二叉樹。

廣義表a(b(d,e(g,)),c(,f))#: 廣義表的表名放在表前,表示樹的根節點,括號中的是根的左右子樹,整個廣義表的最後加上特殊符號#表示輸入結束

實現思路:

*遇到左括號的時候,說明前面有乙個節點,這個括號裡的兩個節點都是它的子節點,但是子節點後面還會有子節點,因此,我們需要乙個先進後出的資料結構把前面的節點儲存下來,這樣棧頂就是當前要處理的兩個節點的父節點;

*逗號分隔了左右子樹,因此需要乙個變數來標識遇到的是左子樹還是右子樹,假設這個變數為k,遇到左括號的時候,k=1,表示開始識別左子樹;

*遇到逗號,k=2表示開始識別右子樹;

*遇到右括號,說明一棵子樹結束了,那麼棧頂的元素就是這顆子樹的根節點,執行pop方法出棧

class bintree 

/*** 初始化二叉樹

*/inittree (str)

if (item === '(') else if (item === ',') else if (item === ')') else else else if (flag === 2) }}

}}/*** 樹的根節點

*/getroot ()

gettreecount (node)

/*** 樹的節點個數

*/size ()

gettreeheight (node) else

}/**

* 樹的高度(深度)

*/height ()

findtreenode (node, data)

// 沒找到,從右節點找

return this.findtreenode(node.rightheight)

}/**

* 查詢節點

*/findnode (data)

/*** 前序遍歷(當前節點->當前節點的左節點->當前節點的右節點)

*/preorder (node)

/*** 中序遍歷(當前節點的左節點->當前節點->當前節點的右節點)

*/inorder (node)

/*** 後序遍歷(當前節點的左節點->當前節點的右節點->當前節點)

*/postorder (node)

}

定義棧:

class stack 

push (data)

pop ()

top ()

size ()

clear ()

isempty ()

}

測試**:

let bintree = new bintree()

bintree.inittree("a(b(d,e(g,)),c(,f))#")

bintree.preorder(bintree.root) // a b d e g c f

console.log(bintree.size())

擴充套件:

1. 樹的映象:對於一棵樹,如果每個節點的左右子樹互換位置,那麼就變成了這顆樹的映象。

function mirror (node) 

mirror(bintree.root)

bintree.inorder(bintree.root) // f c a e g b d

2. 前序遍歷的非遞迴實現 

function preorder(node)

if (curr_node.leftchild) else

}}preorder(bintree.root)

資料結構 樹

樹的概念 1.家族樹 在現實生活中,有入如下血統關係的家族可用樹形圖表示 張源有三個孩子張明 張亮和張麗 張明有兩個孩子張林和張維 張亮有三個孩子張平 張華和張群 張平有兩個孩子張晶和張磊。以上表示很像一棵倒畫的樹。其中 樹根 是張源,樹的 分支點 是張明 張亮和張平,該家族的其餘成員均是 樹葉 而...

資料結構 樹

1 定義 樹是一種非線性結構,是一種一對多的資料結構。分析樹的結構,我們用遞迴的方法,根結點下面又可以看做是子樹。2 樹的儲存結構 我們一般用孩子兄弟法儲存。也就是把乙個結點的左邊第乙個孩子放在此結點的左邊孩子,把此結點的右兄弟放在此結點的右邊孩子。這樣就產生了二叉樹。二叉樹和樹可以相互對應。3 二...

資料結構 樹

二叉樹性質回顧 滿二叉樹 完全二叉樹等 給定一棵二叉樹,要求分層遍歷該二叉樹,即從上到下按層次訪問該樹,每一層單獨輸出一行,每一層要求訪問的順序為從左到右。我們在遍歷的過程中將該層節點的孩子節點壓入乙個佇列,這樣就可以實現從上到下一層一層地遍歷該二叉樹。層序遍歷 並分層列印 如果不用分層的話只用佇列...