閱讀提示
本文將提到在牛客網刷題中遇到的各類知識點:線性表的概念、哈夫曼樹、時間複雜度等多方面知識點並賦實際題目。
1、線性表概念
-
對於同一個線性表,其每一個數據元素的值雖然不同,但必須具有相同的數據類型;
-
數據元素之間具有一種線性的或“一對一”的邏輯關係。
- 第一個數據元素沒有前驅,這個數據元素被稱爲開始節點;
- 最後一個數據元素沒有後繼,這個數據元素被稱爲終端節點;
- 除了第一個和最後一個數據元素外,其他數據元素有且僅有一個前驅和一個後繼。
考題:線性表的鏈表易於插入/刪除,順序表易於尋址
2、 哈夫曼樹
赫夫曼樹,別名“哈夫曼樹”、“最優樹”以及“最優二叉樹”。
路徑: 在一棵樹中,一個結點到另一個結點之間的通路,稱爲路徑。圖 1 中,從根結點到結點 a 之間的通路就是一條路徑。
路徑長度: 在一條路徑中,每經過一個結點,路徑長度都要加 1 。例如在一棵樹中,規定根結點所在層數爲1層,那麼從根結點到第 i 層結點的路徑長度爲 i - 1 。圖 1 中從根結點到結點 c 的路徑長度爲 3。
結點的權: 給每一個結點賦予一個新的數值,被稱爲這個結點的權。例如,圖 1 中結點 a 的權爲 7,結點 b 的權爲 5。
結點的帶權路徑長度: 指的是從根結點到該結點之間的路徑長度與該結點的權的乘積。例如,圖 1 中結點 b 的帶權路徑長度爲 2 * 5 = 10 。
樹的帶權路徑長度爲樹中所有葉子結點的帶權路徑長度之和。通常記作 “WPL” 。例如圖 1 中所示的這顆樹的帶權路徑長度爲:
WPL = 7 * 1 + 5 * 2 + 2 * 3 + 4 * 3
)
什麼是哈夫曼樹?
當用n個節點(都做葉子結點,且都有各自的權值)構建一棵樹時,如果構建的這棵樹的帶權路徑長度最小,稱這棵樹爲 “最優二叉樹” ,有時候也叫赫夫曼樹或者哈夫曼樹
在構建哈夫曼樹的時候,爲了使帶權路徑最小應遵循一個原則:
權重越大的節點離根節點越近,如上圖,a的權重最大 ,故a離根節點最近,理應作爲根節點的孩子節點。
構建哈夫曼樹
在n個權值中選擇兩個最小的權值,構成一個新的二叉樹
也就是說:
直到所有節點都構成了一個新的二叉樹,這就是哈夫曼樹。
考題: 赫夫曼(huffman)樹,在赫夫曼樹中, 每次從候選集中選擇最小的兩個元素構建新的根節點,所以只存在度爲0和2的節點,結點的度數只可能爲0、2
3、前序遍歷、中序遍歷、後序遍歷
前序遍歷:根左右
中序遍歷:左根右
後序遍歷:左右根
eg:
前序:HGEDBFCA
中序:EGBDHFAC
分析:
1.由前序遍歷知,H爲根節點。
2.在中序遍歷中,EGBD爲左子樹,FAC爲右子樹,對比前序遍歷可得G和F作爲第二層的根節點
3.將G,F作爲根節點,看中序遍歷,E爲G的左節點,BD爲右節點,在前序遍歷中,D先於B,故D右節點,將D作爲根節點,B的中序遍歷在D的左邊,故爲左節點
4.右側同理
總結:
前序遍歷的第一個是整個樹的根;
後序遍歷的最後一個是整個樹的根;
中序是用來判別左右子樹劃分的;
前序序列中左子樹部分的第一個節點是左子樹的根節點 ;
前序序列中右子樹部分的第一個節點是右子樹的根節點 ;
4、題: 刪除指針節點
雙向鏈表中有兩個指針域,llink和rlink分別指向前驅和後繼,設p指向鏈表中的一個結點,現要求刪去p所指結點,則正確的刪除是()(鏈中結點數大於2,p不是第一個結點)
答:
首先要更新p結點前後結點的指針域,然後刪除P,所以做法是:
p -> link -> rlink = p -> rlink;
p -> rlink -> link = p -> link;
dispose§;
5、題: 武器暴擊概率題
一個英雄基礎攻擊力爲100,攜帶了三件暴擊武器,武器A有40%的概率打出2倍攻擊,武器B有20%的概率打出4倍攻擊,武器C有10%概率打出6倍攻擊,各暴擊效果觸發是獨立事件,但是多個暴擊效果在一次攻擊中同時觸發時只有後面武器的暴擊真正生效,例如一次攻擊中武器A判定不暴擊,武器B和武器C都判定觸發暴擊,那麼這次攻擊實際是600攻擊力。那麼這個英雄攻擊力的數學期望是____。
答:
也就是說 使用武器3的時候: 600 * 10%
使用武器2的時候,要確保不使用武器3: 400 * (1-10%) * 20%
使用武器1的時候,要確保不適用武器13 : 200 * (1-10%) * (1-20%)
不使用武器的時候:100 * (1-10%) * (1-20%) * (1-40%)
所以 總的數學期望爲: (600 * 10%) +(400 * 90% * 20% )+(200 * 90% * 80% * 40%) +(100 * 60 % * 80% * 90%)= 232.8
6、題:能否構成折半查找
下列選項中,不能構成折半查找中關鍵字比較序列的是____
500,200,450,180
500,450,200,180
180,500,200,450
180,200,500,450
答:
二叉排序樹或者是一棵空樹,或者是具有下列性質的二叉樹:
(1)若左子樹不空,則左子樹上所有結點的值均小於或等於它的根結點的值;
(2)若右子樹不空,則右子樹上所有結點的值均大於或等於它的根結點的值;
(3)左、右子樹也分別爲二叉排序樹;
通俗來講: 那就是前一個元素要麼大於後面每一個元素,要麼小於後面每一個元素
7、基數排序問題
對[21, 49, 84, 45, 12]進行基數排序,第一趟排序的結果爲 ___
答:
對10取餘 進行排序 即按照個位數的大小進行排序
也就是
21,12,84,45,49
8、時間複雜度問題
排序時,若不採用計數排序的等空間換時間的方法,合併m個長度爲n的已排序數組的時間複雜度最優爲___
答:
當n=1時,就成了m個數的歸併排序,時間複雜度爲O(mlogm)
9、二叉鏈表存儲問題
利用二叉鏈表存儲樹,則根結點的右指針是___
答:
二叉鏈表: 左孩子 右兄弟
由於根節點沒有兄弟 所以爲空