非線性集合與數據結構,樹的使用和實現。html
樹的數組實現之計算策略
:一種可能的計算策略是將元素n的左孩子置於位置(2×n+1),將右孩子置於位置(2×(n+1))(特別是對二叉樹的實現)
但有些缺陷:若是咱們存儲的樹不是徹底的或只是相對徹底的,則該數組會爲不包含數據的樹位置分配空間,這就浪費了大量的存儲空間。
java
樹的數組實現之模擬連接策略
:第二個可能策略模擬了操做系統管理內存的方式。容許連續分配數組位置而不用考慮該樹的徹底性,該數組的每一元素都是一個結點類,每一結點存儲的將是每一孩子(可能還有其雙親)的數組索引,而不是做爲指向其孩子(可能還有其雙親)指針的對象引用變量。
缺陷:增長了刪除樹中元素的成本,由於它要麼須要對剩餘元素進行移位以維
持連續狀態,要麼須要保留一個空閒列表。node
遍歷一棵樹有4種基本方法:
git
兩種特殊的二叉樹(1)數組
滿二叉樹( Full Binary Tree ) :每層都「充滿」告終點。深度爲k,結點總數2^k-1,每層結點數2^i-1
數據結構
徹底二叉樹( Complete Binary Tree ):樹中所含的n個結點和滿二叉樹中編號爲1至n的結點一一對應。(滿二叉樹去掉最下層最右邊若干結點)
ide
對二叉樹的一些操做:
學習
問題1解決方案:lua
高度的定義課本給出的是指從根到葉子之間最遠路徑的長度。還有的說法是從結點x向下到某個葉結點最長簡單路徑中邊的條數idea
就像是拿樓房來講,假如一我的提問:樓房的高度有多高?咱們會從底層開始往上數,假如樓有6層,則咱們會說,這個樓有6層樓那麼高。
課本上的例子A到F有四層,可是卻說他的高度爲3。
我在網上看了一些別的例子
人家給出的A到K的高度卻爲5。
因此我理解其實高度這個主要是因爲其根是1層仍是0層產生了不一樣,但不少時候按習慣來講通常都是以1開始。
深度是從根節點往下,深度是從根節點開始(其深度爲1)自頂向下逐層累加的。
總的來講對於整棵樹來講,最深的葉結點的深度就是樹的深度;樹根的高度就是樹的高度。這樣樹的高度和深度是相等的。
對於樹中相同深度的每一個結點來講,它們的高度不必定相同,這取決於每一個結點下面的葉結點的深度。
public int evaluateNode(BinaryTreeNode root) { int result, operand1, operand2; ExpressionTreeOp temp; if (root==null) result = 0; else { temp = (ExpressionTreeOp)root.getElement(); if (temp.isOperator())//判斷temp是不是一個操做符,若是是一個操做數,進入循環,遞歸 { operand1 = evaluateNode(root.getLeft()); operand2 = evaluateNode(root.getRight()); result = computeTerm(temp.getOperator(), operand1, operand2); } else//若是是操做符,則返回值 result = temp.getValue(); } return result; }
public boolean isOperator() { return (termType == 1); }
相應的解釋就在代碼後加入了本身的理解。
是最根本的LinkedBinaryTree.java文件中的方法發生了錯誤,因而進行了調試
發現GetRight和GetLeft的返回值是錯誤的,繼續發現原來是沒有編寫成功height()方法。
最後得出了正確的顯示
上週已總結。
教材中的問題總結的很詳細,第一個問題,由於課本上都是用的二叉樹爲例子,可是
那麼當一個節點只有一個孩子的時候,此時沒有左右孩子之分。
我以爲就算沒有兩個或以上的孩子,但也能根據位置來肯定相對的左右。圖的畫法好像有點錯。此外,結果好像也有點問題,若是它不是左孩子,那麼會先訪問該節點,因此我認爲答案是D、H、B、E、A、F、C、G。
格式好像有點問題。
第十章內容真的是又多又難呀,樹是新接觸的概念,其中有不少的細小的知識和概念要去理解,在總結和記憶這些小知識點上花的時間仍是不少的。此外,這章的代碼其實很難理解,咱們上個學期學了迭代,但說句實話,內容都有些忘了,並且這章不只使用了迭代,並且代碼的邏輯,代碼爲何這樣寫都有些難以理解,書上的代碼有些都由於時間限制,就先囫圇吞棗了一番,以後才慢慢理解了。
代碼行數(新增/累積) | 博客量(新增/累積) | 學習時間(新增/累積) | ||
---|---|---|---|---|
目標 | 5000行 | 30篇 | 400小時 | |
第一週 | 0/0 | 1/1 | 10/10 | |
第二週 | 326/326 | 1/2 | 18/28 | |
第三週 | 784/1110 | 1/3 | 25/53 | |
第四周 | 2529/3638 | 2/5 | 37/90 | |
第五週 | 1254/4892 | 2/7 | 20/110 | |
第六週 | 1403/6295 | 2/9 | 32/142 |
計劃學習時間:30小時
實際學習時間:32小時
改進狀況:
這周由於學習內容較多,因此時間也較長,但仍是要提升一下學習的效率。