20172311《程序設計與數據結構》第六週學習總結

20172311《程序設計與數據結構》第六週學習總結

教材學習內容總結

第十章 樹

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

    若是咱們存儲的樹不是徹底的或者只是相對徹底的,則該數組會爲不包含數據的樹位置分配空間
    git

  • 樹的數組實現之模擬連接策略:數組

    這種方式使得元素可以連續存儲在數組中,所以不會浪費空間,可是該方式增長了刪除樹中元素的成本。
    數據結構

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

以上圖爲例,三種遍歷結果:.net

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

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

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

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

  • 二叉樹的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的能力!!!

參考資料

相關文章
相關標籤/搜索