二叉查詢的中序遍歷是乙個有序序列,由於插入與修改都相當簡單,這裡不說了,說一下二叉查詢樹的刪除
刪除結點有三種情況,刪除的結點為p
1.p沒有子結點
2.p有乙個子結點
3.p有兩個子結點
在上面 1.2 兩種情況下的刪除都很簡單,也不多說,只說一下第三種情況
上面說過,二叉樹的中序遍歷是乙個有序序列,如果 [1,2,3,4],當我們刪除2時,可以將3的值賦值給2,然後再將3刪除,
二叉樹的刪除原理和這一樣,我們找到p的後繼結點s,後繼就是按中序搜尋p後的第一點,我們將s的值賦值給p,然後將s 刪除
這裡可能會問,刪除s不是和直接刪除p一樣了麼,都是刪除乙個結點,這裡說明乙個,他們是不一樣的,如果p有乙個孩子或沒有孩子,那麼我們就直接處理,
如果p結點有兩個孩子,
則p結點的後繼點s乙個是乙個有乙個子結點或乙個子結點都沒有,
我們就用上面的方法處理它的後繼結點,這樣就找到了共同點
package trees;
public class binarysearchtree
public boolean add(int value)
entry parent = e;
do while (e != null);
newentry.parent = parent;
if (value < parent.value)
parent.leftchild = newentry;
else
parent.rightchild = newentry;
return false;
} public boolean contains(int value)
private entry containsentry(int value) while (e != null);
return e; }
public boolean remove(int value)
// 結點乙個結點
private boolean removeentry(entry entry)
entry parent = p.parent;
entry child = p.leftchild != null ? p.leftchild : p.rightchild; // 如果 p 有乙個孩子,則按乙個孩子的辦法處理
if (child != null) else
p.parent = p.leftchild = p.rightchild = null; // 將刪除點的鏈結都指空
} else if (parent == null) else
return true;
} // 得到中序遍歷的下乙個結點
private entry successor(entry entry)
return parent;
} else
return e;
} }private void listentry(entry e)
public void list()
// 靜態內部類
static class entry
} public static void main(string args)
}
二叉樹 二叉查詢樹
構建二叉樹,判斷是否為二叉查詢樹,遞迴先序遍歷,非遞迴中序遍歷 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 ...