父節點、子節點、兄弟節點、根節點、葉子節點、葉節點。
高度、深度、層
滿二叉樹:編號 2 的二叉樹中,葉子節點全都在最底層,除了葉子節點之外,每個節點都有左右兩個子節點,這種二叉樹就叫做滿二叉樹。
完全二叉樹:葉子節點都在最底下兩層,最後一層的葉子節點都靠左排列,並且除了最後一層,其他層的節點個數都要達到最大,這種二叉樹叫做完全二叉樹。
二叉樹的儲存方式:一種是基於指標或者引用的二叉鏈式儲存法,一種是基於陣列的順序儲存法。
前序遍歷、中序遍歷、後序遍歷。
前序遍歷的遞推公式:
preorder
(r)= print r-
>
preorder
(r->left)
->
preorder
(r->right)
中序遍歷的遞推公式:
inorder
(r)=
inorder
(r->left)
->print r-
>
inorder
(r->right)
後序遍歷的遞推公式:
postorder
(r)=
postorder
(r->left)
->
postorder
(r->right)
->print r
偽**
void
preorder
(node* root)
void
inorder
(node* root)
void
postorder
(node* root)
時間複雜度:從前、中、後序遍歷的順序圖,可以看出來,每個節點最多會被訪問兩次,所以遍歷操作的時間複雜度,跟節點的個數 n 成正比,也就是說二叉樹遍歷的時間複雜度是 o(n)。
二叉查詢樹是二叉樹中最常用的一種型別,也叫二叉搜尋樹。
二叉查詢樹的特點:在樹中的任意乙個節點,其左子樹中的每個節點的值,都要小於這個節點的值,而右子樹節點的值都大於這個節點的值。
}刪除的三種情況第一種情況是,如果要刪除的節點沒有子節點,我們只需要直接將父節點中,指向要刪除節點的指標置為 null。比如圖中的刪除節點 55。
第二種情況是,如果要刪除的節點只有乙個子節點(只有左子節點或者右子節點),我們只需要更新父節點中,指向要刪除節點的指標,讓它指向要刪除節點的子節點就可以了。比如圖中的刪除節點 13
第三種情況是,如果要刪除的節點有兩個子節點,這就比較複雜了。我們需要找到這個節點的右子樹中的最小節點,把它替換到要刪除的節點上。然後再刪除掉這個最小節點,因為最小節點肯定沒有左子節點(如果有左子結點,那就不是最小節點了),所以,我們可以應用上面兩條規則來刪除這個最小節點。比如圖中的刪除節點 18。
;// 沒有找到
// 要刪除的節點有兩個子節點
if(p.left != null && p.right != null)
p.data = minp.data;
// 將minp的資料替換到p中
p = minp;
// 下面就變成了刪除minp了
pp = minpp;
}// 刪除節點是葉子節點或者僅有乙個子節點
node child;
// p的子節點
if(p.left != null) child = p.left;
else
if(p.right != null) child = p.right;
else child = null;
if(pp == null) tree = child;
// 刪除的是根節點
else
if(pp.left == p) pp.left = child;
else pp.right = child;
}平衡二叉查詢樹的高度接近 logn,所以插入、刪除、查詢操作的時間複雜度也比較穩定,是 o(logn)。
演算法與資料結構 二叉樹
二叉樹 binary tree 二分樹 二元樹 二叉樹的遞迴定義 或是空樹,或是一棵由乙個根結點和左右子樹組成的樹,且左右子樹也是二叉樹。分枝結點 除葉結點以外的結點。二叉樹的性質 最多 2 h 1 個結點 n2 n0 1 滿二叉樹 所有分枝結點都存在左右子樹,且葉結點都在同一層。完全二叉樹 除最後...
資料結構與演算法 二叉樹
1.普通二叉樹 treenode package math public class treenode public void setdata int data public treenode getlchild public void setlchild treenode lchild publi...
資料結構與演算法 二叉樹
二叉樹是每個節點最多有兩個子樹的樹結構。通常子樹被稱作 左子樹 left subtree 和 右子樹 right subtree 性質1 在二叉樹的第i層上至多有2 i 1 個結點 i 0 性質2 深度為k的二叉樹至多有2 k 1個結點 k 0 性質3 對於任意一棵二叉樹,如果其葉結點數為n0,而度...