java中二叉排序樹模型的建立

2021-07-04 08:00:22 字數 1764 閱讀 6168

二叉排序樹或者是一棵空樹,或者是具有下列性質的

二叉樹:

(1)若左子樹不空,則左子樹上所有結點的值均小於它的

根結點的值;

(2)若右子樹不空,則右子樹上所有結點的值均大於或等於它的根結點的值;

(3)左、右子樹也分別為二叉排序樹;

(4)沒有鍵值相等的節點。

插入和建立過程比較簡單,我就不說了,這裡討論下刪除操作:

在二叉排序樹刪去乙個結點,分三種情況討論:

若*p結點為葉子結點,即pl(左子樹)和pr(右子樹)均為空樹。由於刪去葉子結點不破壞整棵樹的結構,則可以直接刪除此子結點。

若*p結點只有左子樹pl或右子樹pr,此時只要令pl或pr直接成為其雙親結點*f的左子樹(當*p是左子樹)或右子樹(當*p是右子樹)即可,作此修改也不破壞二叉排序樹的特性。

若*p結點的左子樹和右子樹均不空。在刪去*p之後,為保持其它元素之間的相對位置不變,可按中序遍歷保持有序進行調整,可以有兩種做法:

其一是令*p的左子樹為*f的左/右(依*p是*f的左子樹還是右子樹而定)子樹,*s為*p左子樹的最右下的結點,而*p的右子樹為*s的右子樹;

其二是令*p的直接前驅(或直接後繼)替代*p,然後再從二叉排序樹中刪去它的直接前驅(或直接後繼)-即讓*f的左子樹(如果有的話)成為*p左子樹的最左下結點(如果有的話),再讓*f成為*p的左右結點的父結點。

我們廢話就不多說了,直接上**

package oj;

public class binarysorttree

public bst(int data,bst lchild,bst rchild)

public bst(int data) }

public void createbst(int d)

/*** 插入新節點

* 注意該演算法要求新節點的值不能與已有節點的值重複

* @param d

*/public void insertbst(int d)

while(p!=null)

} if(dx)

parent.lchild=null;

if(parent.datax)

parent.lchild=p.rchild;

if(parent.datax)

parent.lchild=p.lchild;

if(parent.dataparent.rchild=p.lchild;}}

//4、此時左右子樹非空,我們的策略是找出右子樹中最小的元素(即左下節點),將該節點的值複製到待刪除節點

// 若該節點尚有右孩子,則將該孩子掛到父親節點的左子樹上,若父節點恰好是待刪除節點,那麼就將該孩子節點掛到待刪節點的右子樹上

if(p.lchild!=null&&p.rchild!=null)

p.data=s.data;

if(s.rchild!=null)}}

}}

else }

public void inorder(bst root) }

public static void main(string args);

btree.createbst(d);

btree.delete(2);

btree.inorder(btree.root);

}}

需要注意的是,在c++語言中,我們還能見到一種利用遞迴進行插入和刪除的方法,但那種方法雖然**較簡單,但理解與維護都比較困難,而且效率也不高,因此我們不妨乾脆選用非遞迴方式。

二叉排序樹建立 JAVA實現

最近看了一下二叉排序樹的建立,自己寫了一段 用來建立二叉排序樹,給定乙個陣列,對這個陣列中的數字進行建立二叉排序樹。分兩種情況 1 陣列中的數字是隨機的,也就是說沒有順序 eg int a 用這個陣列中的數字建立二叉排序樹,注意這裡的二叉排序樹是隨便的,沒有特殊的要求 比如建立高度最小的二叉排序樹 ...

建立二叉排序樹

建立二叉排序樹 1 建立二叉排序樹,二叉樹排序樹有個特點,如果結點值大於根,則在右子樹去查詢插入位置,如果小於樹根,在左子樹去查詢樹根,如果相等,不作任何操作 2 根據上面的特性,需要兩個結點,分別是當前結點和父節點 3 先遍歷二叉樹節點,找到要插入的位置,根據父節點的指向要插入的位置 實現過程如下...

JAVA 二叉排序樹

二叉排序樹 二叉檢索樹 author lao yang public class binarysearchtree 插入乙個節點,假如已經存在這個值返回 false 否則true param value 節點值 return 插入成功與否 public boolean insert int valu...