對于什么是樹,以及樹的概念,我們在這里不做贅述了,大家在數(shù)據(jù)結構的課程里都應該學過,這里我推薦mooc慕課中浙江大學陳越老師的《數(shù)據(jù)結構》課程,非常便于理解數(shù)據(jù)結構的知識,而且對于算法的講解很透徹。
今天我們主要講的是如何設計一個二叉樹類,大家都知道Java中是沒有結點以及指針類型的,實現(xiàn)起來有時會讓我們摸不到頭腦,這一講也是為了以后深入了解二叉樹相關算法和十分重要的二叉樹的遍歷作為提前的知識儲備,比較簡單,很容易理解:)
二叉樹的抽象數(shù)據(jù)類型
首先我們要了解二叉樹基本實現(xiàn)所需要的抽象數(shù)據(jù)類型,從兩個方面介紹
①.數(shù)據(jù)集合:為二叉樹的結點集合,每個結點由數(shù)據(jù)元素和構造數(shù)據(jù)元素之間關系的指針組成。
②.操作集合:
(1)雙親結點parent():
(2)左孩子結點leftChild()
(3)右孩子結點rightSibling()
(4)左插入結點insertLeftNode(x)
(5)右插入結點insertRightNode(x):
(6)左刪除子樹deleteLeftTree()
(7)右刪除子樹deleteRightTree()
(8)遍歷二叉樹traverse(vs)---最重要也就是這個啦
二叉樹的存儲結構
1.順序存儲結構
(a)為非完全二叉樹,既然我們要存儲(a),首先我們要把它變成完全二叉樹,也就是將空余部分補上,因為二叉樹本身就是有順序的,樹根為0,所以A為0 B為1 C為2 我們順序把結點存入數(shù)組,空出來的地方就為空
2.鏈式存儲結構
二叉樹的鏈式存儲結構是用指針建立二叉樹中結點之間的關系。
二叉鏈存儲結構的每個結點包含三個域 。
data:為數(shù)據(jù)域 ?leftChild:為左孩子的指針域 ?rightChild:為右孩子的指針域
舉個小栗子~
(a)不帶頭結點的二叉樹,可以看到,沒有指針域的結點,左邊或者右邊為空
(b)帶頭結點的二叉樹,頭結點只負責指向我們的樹根結點
設計二叉樹
二叉樹由三個部分組成:結點、左孩子、右孩子,因此我們要設計的二叉樹類由兩個部分組成:二叉樹類和二叉樹結點類。
二叉樹結點類
首先我們聲明三個私有的成員變量:數(shù)據(jù)元素(即結點的值)、左孩子和右孩子,生成get/set方法,為了方便初始化和傳值,我們分別聲明一個無參的構造方法和有參的構造方法。具體代碼如下。
二叉樹類
當我們有了二叉樹結點類,我們就可以創(chuàng)建一個二叉樹了,我們把結點的數(shù)據(jù)元素傳給我們的二叉樹結點類,并且區(qū)分好左右,這樣我們的二叉樹就建立好了。
總結
理解好二叉樹的存儲結構至關重要,也是為了我們接下來學習遍歷二叉樹而大號基礎。
下一講,我們就開始研究如何遍歷二叉樹的算法!直奔主題!
PS:有什么問題或者不解的地方可以評論,我都會一一就行回復的,如果有錯誤或者言語不明的地方,還請大神多多指點!