1. 程式人生 > >20172311《程式設計與資料結構》第七週學習總結

20172311《程式設計與資料結構》第七週學習總結

20172311《程式設計與資料結構》第七週學習總結

教材學習內容總結

第十一章 二叉查詢樹

  • 樹是一種非線性結構,其中的元素被組織成一個層次結構
  • 含有m個元素的平衡n元樹具有的高度為lognm
  • 樹的陣列實現之計算策略:

    如果我們儲存的樹不是完全的或者只是相對完全的,則該陣列會為不包含資料的樹位置分配空間

  • 樹的陣列實現之模擬連結策略:

    這種方式使得元素能夠連續儲存在陣列中,因此不會浪費空間,但是該方式增加了刪除樹中元素的成本。

  • 樹的遍歷
    1.先序遍歷
    即根節點在左右子樹之前遍歷:
    先訪問根節點
    再先序遍歷左子樹
    再先序遍歷右子樹
    退出
    2.中序遍歷
    先中序遍歷左子樹
    再訪問根節點
    再中序遍歷右子樹
    退出
    3.後序遍歷
    即根節點在左右子樹之後遍歷:
    先後序遍歷左子樹
    再後序遍歷右子樹
    最後訪問根節點
    退出
    4.層序遍歷
    即從根節點開始,訪問每一層的所有結點,一次一層

以上圖為例,三種遍歷結果:

先序遍歷:
1 2 4 5 7 3 6

中序遍歷:
4 2 7 5 1 3 6

後序遍歷:
4 7 5 2 6 3 1

層序遍歷:
1 2 3 4 5 6 7

  • 二叉樹的ADT

  • 二叉樹

    二叉樹是有限個節點的集合,這個集合可以是空集,也可以是一個根節點和至多兩個子二叉樹組成的集合,其中一顆樹叫做根的左子樹,另一棵叫做根的右子樹。簡單地說,二叉樹是每個節點至多有兩個子樹的樹

  • 完全二叉樹

    完全二叉樹是一種特殊的二叉樹,滿足以下要求:
    1.所有葉子節點都出現在 k 或者 k-1 層,而且從 1 到 k-1 層必須達到最大節點數;
    2.第 k 層可是不是慢的,但是第 k 層的所有節點必須集中在最左邊。
    簡單地說, 就是葉子節點都必須在最後一層或者倒數第二層,而且必須在左邊。任何一個節點都不能沒有左子樹卻有右子樹。

  • 滿二叉樹

    如果一棵樹的高度為 k,且擁有 2^k-1 個節點,則稱之為 滿二叉樹。
    就是說,每個節點要麼必須有兩棵子樹,要麼沒有子樹。

  • 滿二叉樹 和 完全二叉樹 的對比圖

教材學習中的問題和解決過程

  • 問題:鏈式二叉樹中的find方法只能用在contain方法裡,能不能返回一個BinaryTreeNode物件 ,便於往樹中新增新的元素
  • 問題解決方案:
    1.find方法原始碼
  public T find(T targetElement) {
        BinaryTreeNode<T> current = findNode(targetElement, root);

        if (current == null)
            throw new ElementNotFoundException("LinkedBinaryTree");

        return (current.getElement());
    }  

返回BinaryTreeNode物件的find方法程式碼

public BinaryTreeNode<T> findNode(T targetElement) {
        BinaryTreeNode<T> current = findNode(targetElement, root);

        if (current == null)
            throw new ElementNotFoundException("LinkedBinaryTree");

        return current;
    }  

2.經過對程式碼的深入理解發現這種方法並不可行,因為這樣新加入的元素並不能是一個單獨的LinkedBinaryTree(鏈式二叉樹)物件,只是一個BinaryTreeNode(二叉樹結點)物件,這樣會導致新插入的元素不能使用鏈式二叉樹類裡的方法。

程式碼除錯中的問題和解決過程

  • 問題:背部診斷器類執行時一直報錯

  • 問題解決方案:
    經過單步除錯發現是因為我的LinkedBinaryTree類裡的getLeft方法和getRight方法返回的是BinaryTreeNode物件而不是LinkedBinaryTree物件,
    對兩個方法進行修改後終於使問題得到解決
    1.修改前的getLeft方法和getRight方法程式碼
//返回結點的左側子結點
    public BinaryTreeNode<T> getLeft() {
        return left.root;
    }
    //返回結點的右側子結點
    public BinaryTreeNode<T> getRight() {
        return right.root;
    }  
  1. 修改後的getLeft方法和getRight方法程式碼
   public LinkedBinaryTree<T> getLeft() {
        return left.root;
    }
    //返回結點的右側子結點
    public LinkedBinaryTree<T> getRight() {
        return right.root;
    }    

程式碼託管

上週考試錯題總結

上週無錯題!!!

結對及互評

  • 本週結對學習情況
    本週主要對鏈式二叉樹進行了較為深入的學習,在學習的過程中遇到了諸多較難的問題,有的問題我們兩個也是都摸不著頭腦,但是通過查閱相關的資料最終使問題得到了解決!

感想

本週的主要學習內容是對樹的概念進行了較為深入的瞭解,並且對鏈式二茬表的實現進行了學習和實現,本章課本的例題程式碼比較複雜(對我來說很複雜了),在閱讀程式碼的過程中也是花費了不少時間,通過對本章的學習也是認識到了我的閱讀程式碼能力還是很差的!希望以後繼續努力,讓自己在這方面的能力有所提高吧!

學習進度條

程式碼行數(新增/累積) 部落格量(新增/累積) 學習時間(新增/累積) 重要成長
目標 5000行 30篇 400小時
第一週 0/0 1/1 4/4
第二週 464/464 1/2 10/14 理解掌握了用陣列和連結串列實現棧的方法
第三週 494/958 1/3 10/24 理解掌握了用陣列和連結串列實現佇列的方法
第四周 1629/2587 2/5 20/44 對用連結串列和陣列實現列表進行了學習
第五週 856/3443 2/7 15/59 較為深入的學習了查詢和排序方法的實現
第六週 668/4111 1/8 20/79 學習了鏈式二叉樹的實現
  • 計劃學習時間:20小時

  • 實際學習時間:20小時

  • 改進情況:注重提高閱讀複雜程式碼的能力,努力提高解決程式碼bug的能力!!!

參考資料