DS博客做業05--樹

1.本週學習總結(0--2分)

1.1思惟導圖

1.2談談你對樹結構的認識及學習體會

樹是數據結構中比較重要也是比較難理解的一類存儲結構,它是由n(n>=1)個有限節點組成一個具備層次關係的集合。
①單個結點是一棵樹,樹根就是該結點自己。
②若是一個結點P的全部子節點都是子樹的根,那P也是一個根。
③空集也是樹,稱爲空樹。空樹中沒有結點。
樹有多種類型,可分爲二叉樹和哈夫曼樹等,其中二叉樹又可分爲徹底二叉樹和滿二叉樹。
樹的應用很廣,樹在文件系統、編譯器、索引以及查找算法中都有應用。
在學習中遇到的困難:簡單的創建一棵樹不會用代碼表達出來。
在樹中需用到遞歸的思想,但我還沒掌握遞歸的內容。

2.PTA實驗做業(6分)

2.1.題目1:求 二叉樹的高度

2.1.1設計思路(僞代碼)

.比較一棵樹的左右子樹的高度,高的子樹+1即該二叉樹的高度
int GetHeight( BinTree BT )   //求二叉樹高度的函數
.if(樹空)  返回0
.分別計算左右子樹的高度(遞歸調用求高度的函數)
.if(左子樹高度>右子樹高度)  返回 左子樹高度+1
.不然  返回 右子樹高度+1

2.1.2代碼截圖(注意,截圖,截圖,截圖。不要粘貼博客上。)

2.1.3本題PTA提交列表說明

1.編譯錯誤:Lelf和Right的大小寫混亂
2.段錯誤:在判斷BT是否爲空時,寫成了if(BT=NULL),少了一個「=」號

2.2.題目2:二叉樹葉子結點帶權路徑長度和

2.2.1設計思路(僞代碼)

.本題有兩個函數,建樹函數和求帶權路徑長的函數。
建樹函數:
.判斷從主函數傳過來的i是否大於字符串長度,若大於或者str[i]=「#」都返回NULL。
.不然,把str[i]的值賦給bt->data
.再遞歸調用該函數自己獲得結點的左孩子和右孩子。

求帶權路徑長的函數:
.若是結點的左孩子和右孩子都爲空,說明這個結點是葉子結點。
.該葉子結點的帶權路徑長度等於該結點值*其路徑長度
.遞歸調用該函數自己算出每一個左右葉子結點的帶權路徑長度

2.2.2代碼截圖(注意,截圖,截圖,截圖。不要粘貼博客上。)


2.2.3本題PTA提交列表說明。


.在遞歸調用建樹函數獲得左右孩子結點時,左右孩子和i的關係搞反了,寫成bt->left = CreateBtree(str,2*i+1)
.建樹時沒有考慮i>字符串長度的狀況

2.3.題目3:根據後序和中序遍歷輸出先序遍歷

2.3.1設計思路(僞代碼)

本題主要有建樹函數和輸出結點兩個函數
.建樹函數:
在主函數中定義兩個整型數組分別存放後序遍歷和中序遍歷的結點的數值,再傳參到建樹函數中
.用一個for循環遍歷中序數組中的數據,若是中序數組中某一個值與後序數組的最後一個值相等,則中止循環。
.根據給定的一棵二叉樹的後序遍歷和中序遍歷結果,遞歸調用該函數獲得這棵樹的每一個結點,最後獲得一棵樹。

輸出結點函數:
遞歸,先輸出左孩子再輸出右孩子(沒什麼好講的)

2.3.2代碼截圖(注意,截圖,截圖,截圖。不要粘貼博客上。)



2.3.3本題PTA提交列表說明。

.輸出格式忘記控制前面的空格。
.在輸出結點的函數中,先輸出了右結點再輸出左結點,順序不對
.建樹函數中,在for循環裏,沒有控制好下標緻使超出界限

三、閱讀代碼(-2--2分)

找一份和樹相關代碼,談談你對這個代碼認識體會。面試

考研題種關於樹內容。
ACM、PTA天梯賽、leecode面試刷題網站,找樹相關題目閱讀分析。
請按照下面內容填寫代碼閱讀內容。請未必認真完成,若是發現應付,沒有介紹代碼思路、體會等扣分。算法

3.1 題目:To Add or Not to Add (添加或不添加)

題目意思:
給定一個數組,每次能夠給任意元素加1,這樣的操做不能超過k次,求操做不超過k次後數組中一個數可以出現的最屢次數,以及可以以這個次數出現的最小的數。

3.2 解題思路

分析:這個題目明顯具備單調性,這樣的話就能夠進行二分搜索求取最大次數了。怎麼判斷假定的解是否可行呢?既然只能是加1,並且又不超過k次,那麼首先將數組排序,假設搜索的次數爲m,那麼i從第m個數循環到最後一個數,只要知足了次數不小於k就當即退出循環,這樣找到的便必定是出現m次的最小的數,可是這個判斷的過程就是第m個數與其以前的m-1個數的差之和要不大於k,若是每次都直接加上差進行判斷一定超時,由於二分搜索加循環判斷的時間複雜度過高,那麼最好的優化就是直接以前預處理,求出第1個數到第m個數區間的和,後面判斷的時候直接就是o(1)計算區間的和了。

3.3 代碼截圖


3.4 學習體會

.這段代碼中用了const定義常量,const修飾一個變量時,必定要給這個變量初始化,若不初始化,在後面也不能初始化。
這是我在以前的學習中沒有用過的定義方法。其中const的優勢有:能夠很方便的進行參數的修改和調整,同時避免意義模糊的數字出現。
.這段代碼的實現用了預處理,減小重複的計算從而減小時間複雜度,使得算法性能顯著提升。
相關文章
相關標籤/搜索