/*
* 二叉搜尋樹
* * 左節點的數比根節點的數小,右邊的數要比更節點數大
*/public class binarytree
/** 按照規則:左邊的數比根節點小,右邊的數比根節點大
* 先進行反覆比較,一直到最後和葉子節點比較,選擇插在左還是右
*/public
void insert ( int data )
current = root ;
while ( current !=
null )
}//比他大,往右
else}}
}public node find ( int data )
//往右
else
if ( current.
data
<
data )
//既不大又不小,那就是=嘍,返回此節點
else
}else
//執行到這,說明current已為null , 沒找到
return
null ;
}//找最大,通常情況下最大值在樹的最右分支上
public node findmax ()
return
parent ;
}public node findmin ()
return
parent ;}/*
** 二叉樹的刪除要考慮4種情況:
** 1.被刪除的節點是葉子結點 :直接賦為null
* 2.被刪除的節點只有左子節點:左子節點上來
* 3.被刪除的節點只有右子節點:右子節點上來
* 4.被刪除的結點有兩個節點:取其右子節點的左葉子節點(最後乙個)上來
* (如果其右子節點是葉子結點或者沒有左子節點,直接將右子節點提上來)
*/public boolean delete ( int data )
//往右
else
}//跳出迴圈代表找到要刪除的資料
//1.判斷是否是第一種情況
if ( current.left ==
null
&& current.right ==
null )
else
else
current =
null ;
return
true ;}}
//2.判斷是否是第二種
if ( current.left !=
null
&& current.right ==
null )
else
else
return
true ;}}
//3.判斷是否為第三種
if ( current.left ==
null
&& current.right !=
null )
else
else
return
true ;}}
//4 。第四種 (最麻煩的一種)
if ( current.left !=
null
&& current.right !=
null )
//如果條件成立,代表此時要刪除的節點的右子節點沒有左子節點
if ( isnull ==
true )
else
}//執行到這說明有左子節點,找到右節點的葉左葉子結點(也叫中序後繼節點)
while ( son.left !=
null )
//迴圈結束,代表找到了此時son就是最後的節點
sonp.left =
null ;//抹除son父節點對其的引用
son.right = current.right ;//將要刪除的節點的右引用轉移到son身上來
son.left = current.left ;
if ( current == root )
else
else
return
true ;}}
//如果真能執行到這說明上面**都不符合只能false了
return
false ;
}public
void display ()
//使用遞迴遍歷
public
void frontdisplay ( node next )
}//中序:左根右
public
void middisplay ( node next )
}//後序:左右根
public
void lastdisplay ( node next )
}public
void leveldisplay ()
if ( current.right !=
null )
}system.out.println ( );
}// ------------------------------------
//非遞迴遍歷
//中序 左 根 右
public
void mid ( node n )
//跳出迴圈代表遍歷左子節點完畢,左子節點都入棧了
if ( s.isempty () !=
true )}}
//先序
public
void front ( node n )
if ( s.isempty () !=
true )}}
//後序(沒寫出來)
public
void last ( node n )
}
stack
public
class stack
n.next = top ;
top = n ;
}public node pop ()
top = top.next ;
return temp ;
}public boolean isempty ()
}
queue
public class queue
public void add ( node n )
rear.next = n ;
rear = n;
} public node delete ()
node temp = front ;
front = front.next ;
return temp ;
} public boolean isempty () }
**
二叉搜尋樹c 資料結構二叉搜尋樹
在n個動態的整數中搜尋某個整數?檢視其是否存在 假設使用動態陣列存放元素,從第 0 個位置開始遍歷搜尋,平均時間複雜度 o n 如果維護乙個有序的動態陣列,使用二分搜尋,最壞時間複雜度 o logn 但是新增 刪除的平均時間複雜度是 o n 針對這個需求,有沒有更好的方案?今天我們主要講的就是二叉搜...
資料結構(二叉搜尋樹)
二叉搜尋樹是一種可以高效完成以下操作的樹型的資料結構 插入乙個值 查詢是否含有某個值 刪除某個值 它儲存節點的資料資訊時,遵循以下規則,左子樹的值 根節點值 右子樹的值 下面是基本的二叉搜尋樹的實現 include include include includeusing namespace std...
資料結構 二叉搜尋樹
二叉搜尋樹的所有節點都滿足左子樹上的所有節點都比自己小,而右子樹上的所有節點都比自己大這一條件。當刪除某個節點時,需要根據下面幾種情況分別進行處理 需要刪除的節點沒有左兒子,那麼就把右兒子提上去。需要刪除的節點的左兒子沒有右兒子,那麼就把左兒子提上去。以上兩種情況都不滿足的話,就把左兒子的子孫 左子...