關於樹的那點事。

2021-10-04 11:09:31 字數 1434 閱讀 5172

突發奇想的想寫一些關於樹的用法,以後把經常用到的或者覺得重要的用法都給整理下來,好複習用。

因為用得比較多的是二叉樹,所以先說一些二叉樹的性質:

性質1:二叉樹第i層上的結點數目最多為2i-1(i >= 1);

性質2:深度為k的二叉樹至多有2k-1個結點(k >= 1);

性質3:包含n個結點的二叉樹的高度(k)至少為(log2n)+1(k >= 1);

性質4:在任意一棵二叉樹中,若終端結點的個數為n0,度為2的結點數為n2,則n0 = n2 +1。

二叉樹的遍歷:

前序遍歷:根——左——右

中序遍歷:左——根——右

後序遍歷:左——右——根

滿二叉樹、完全二叉樹

一、滿二叉樹

定義:高度為k(k >= 1),且節點個數為2k-1的二叉樹,稱為滿二叉樹。

特點:最高層全為葉子節點。

二、完全二叉樹

定義:若設二叉樹的深度為k,除第k層外,其它各層 (1~k-1) 的結點數都達到最大個數,第k層所有的結點都連續集中在最左邊,這就是完全二叉樹。

特點:完全二叉樹中節點的度為1的節點個數為1或0。

用法:

①根據邊(無向圖)的關係來建立二叉樹(將邊的權值問題轉換為節點的權值問題):

edgeweight[x][y] 儲存節點x、y之間權值 tree[x][0]/[1]表示根節點x的左孩子/右孩子結點 pointweight[p]表示節點p的權值

build(root, c, lor):建立根節點root與孩子節點c的關係,lor == 0表示左孩子, lor == 1表示右孩子

在建立結點關係的時候,可以將root與c之間邊的權值儲存到子節點c中,這樣就實現了將邊的權值問題轉換為節點的權值問題了

make_tree(root):以root為根節點建立二叉樹,遍歷edgeweight[root][k(0~end)]

如果遇到root與k有邊的關係,則讓k成為root的孩子節點(第一次為左孩子,第二次為右孩子(根據題目需求來))

需要注意的是在用build建立關係時,需要在建立完成後讓edgeweight[root][k] 與 edgeweight[k][root] 的權值無效化,防止形成環

#define ineffective -1

vectorint>

> edgeweight, tree;

vector<

int> pointweight;

void

make_tree

(int root)

;void

build

(int root,

int c,

int lor)

void

make_tree

(int root)

}}

關於rbac那點事

rbac role based access control,基於角色的訪問控制 就是使用者通過角色與許可權進行關聯。簡單地說,乙個使用者擁有若干角色,每乙個角色擁有若干許可權。這樣,就構造成 使用者 角色 許可權 的授權模型。在這種模型中,使用者與角色之間,角色與許可權之間,一般者是多對多的關係。...

關於亂碼的那點事

首先如果不編碼,那些非英文abc等字元會被瀏覽器按照網頁當前的字符集進行編碼傳到伺服器去,而伺服器則只會按照伺服器配置的字符集編碼 有預設的好像就是iso x 進行解碼,所以如果網頁的字符集和伺服器字符集解碼一致那麼就不會出亂碼!但是往往對於我們來說是不一致的。所以一般情況會出現亂碼,所以就有人想到...

關於Json的那點事

說明 說明一點js是直接支援json的 所以可以直接如下寫 var a 直接是json物件 而不必 寫成 var a 這樣寫是字串 反而錯誤 所以 在.aspx 頁面輸出json的時候可以直接 前端 json格式當做回傳資料時請使用 jquery.getjson url,data callback ...