以前學過二叉樹,是用c語言實現的,當時雖然聽懂了,但是自己用c語言實現,還是有點困難的,現在學習了前端,發現二叉樹還是很簡單的。今天就來說一說。
二叉樹是一種常用的資料結構,樹也是一種非線性的資料結構,以分層的方式儲存資料,樹被用來儲存具有層級關係的資料,比如系統中的檔案,還有前端經常說到的dom樹。現在我們研究的是一種特殊的樹。
function
node
(data, left, right)
這裡的show是用來顯示儲存在節點裡面的資料
function
show
()
有了節點之後,我們需要有一顆二叉查詢樹bst(binary search tree)
function
bst()
/*插入資料的演算法是
我們先新建乙個節點,把當前的資料放到這個節點中去
我們先判讀當前的樹是否為空,如果為空,就把該節點作為根節點
如果不為空,就需要遍歷bst了,找到要插入的位置,用乙個變數儲存當前的節點,一層層的進行遍歷
進入bst後,我們要決定將節點放置到哪個位置,找到正確的插入點,就後跳出迴圈
演算法如下
(1)設根節點為當前節點
(2)如果待插入節點儲存的資料小於當前節點,就設新的當前節點為原節點的左節點,否則,執行第四步
(3)如果當前節點的左節點為null,就將新的節點插入這個位置,退出迴圈,反之繼續執行下一次迴圈
(4)設新的節點為原節點的右節點
(5)如果當前節點的右節點為null,就將新的節點插入到這個位置,退出迴圈,反之,進行下一次迴圈
*/function
insert
(data) else
} else }}
}
現在二叉樹初步成型,我們需要有能力遍歷bst,這樣就可以按照不同的順序,比如按照數字的大小先後,顯示節點上的資料
有三種遍歷bst的方式,中序、先序和後序。中序遍歷按照節點上的鍵值,以公升序訪問bst上的所有節點。
先序遍歷先訪問根節點,然後以同樣的方式訪問左子樹和右子樹,
後序遍歷先訪問葉子節點,從左子樹到右子樹,再到根節點。
中序遍歷使用遞迴的方式最容易實現
這裡的inorder是中序遍歷的意思。
先訪問左子樹,再訪問根節點,最後訪問右子樹,倘若不理解遞迴,就先看乙個例子,
if (number == 1) else
}print(factorial(5));
畫一幅圖進行理解
5
*factorial(4)5*4
*factorial(3)5*4
*3*factorial(2)5*4
*3*2*15
*4*3*25
*4*6
5*24
120
看了這個過程就很好理解了。
function
inorder
(node)
}
function
preorder
(node)
}
function
postorder
(node)
}
(1)查詢給定值
(2)查詢最小值
(3)查詢最大值
查詢最大值和 最小值非常簡單,因為較小的值總是在左子節點上,在bst上查詢最小值,只需要遍歷左子樹,直到找到最後乙個節點
getmin()方法查詢bst上的最小值,
function
getmin
() return current.data;
}
function
getmax
() return current.data;
}
查詢給定值
function find(data)
else
if (data
< current.
data)
else
}return
null;
}
從bst中刪除節點的第一步是判斷當前節點是否包含待刪除資料,如果包含,則刪除該結點,如果不包含,則比較當前節點上的資料和待刪除的資料。如果待刪除的資料小於當前節點的資料,則移至當前節點的左子節點進行比較,如果刪除的資料大於當前節點上的資料,則移至當前節點的右子節點繼續比較。
如果待刪除節點是葉子節點,那麼只需要將從父節點指向他的鏈結指向null,
如果待刪除節點只包含乙個子節點,那麼原本指向他的節點就得做些調整,使其執行他的子節點。
如果待刪除節點包含兩個子節點,正確的做法有兩種:要麼查詢待刪除節點左子樹上的最大值,要麼查詢其右子樹上的最小值。這裡我們選擇後一種方式。
我們需要乙個查詢子樹最小值的方法,後面會用他找到的最小值建立乙個臨時節點,將臨時節點上的值賦值到待刪除節點,然後在刪除臨時節點。
function remove (data)
function removenode(node, data)
if (data
== node.
data)
//沒有左子節點的節點
if (node.left ==
null)
//沒有右子節點的節點
if (node.right ==
null)
//有兩個子節點的節點
var tempnode = getsmallest(node.right);
node.
data
= tempnode.
data;
node.right = removenode(node.right, tempnode.
data);
return node;
}else
if(data
< node.
data)
else
else
}
二叉樹 二叉查詢樹
構建二叉樹,判斷是否為二叉查詢樹,遞迴先序遍歷,非遞迴中序遍歷 include include include include using namespace std 二叉樹結點 struct treenode 鍊錶結點 struct listnode struct tempnodetempnode...
二叉樹 二叉查詢樹
二叉樹 binary tree 一種樹型結構,每個節點最多擁有兩個節點。如下圖 幾種型別的二叉樹 1.full binary tree 每個節點的孩子數 是 0 或者 2.對高度沒有要求。如下圖 2.perfect binary tree 這個就是最完美的樹,顧名思義,所有葉子節點都有相同的深度,並...
樹(樹,二叉樹,二叉查詢樹)
1.定義 n n 0 個結點構成的有限集合。當n 0時,稱為空樹 2.對於任一棵非空樹 n 0 它具備以下性質 1 樹中有乙個稱為 根 root 的特殊結點,用 r 表示 2 其餘結點可分為m m 0 個互不相交的有限集t1,t2,其中每個集合本身又是一棵樹,稱為原來樹的子樹。3.樹的一些性質 1 ...