當前位置:首頁 » 編程語言 » java二叉排序樹

java二叉排序樹

發布時間: 2023-07-14 08:24:26

Ⅰ 二叉排序樹的插入與查找 求java大神幫忙


//二叉樹結構類Btree.java
publicclassBtree{
privateintdata;
privateBtreeleft;
privateBtreeright;
publicvoidsetData(intdata){
this.data=data;
}
publicintgetData(){
returndata;
}
publicvoidsetLeft(Btreebtree){
this.left=btree;
}
publicvoidsetRight(Btreebtree){
this.right=btree;
}
publicBtreegetLeft(){
returnleft;
}
publicBtreegetRight(){
returnright;
}
publicBtree(){
super();
}
}
//工具類,二叉樹創建,查找,遍歷,排序。都在這了Tools.java
publicclassTools{
publicBtreecreate(intdata){
Btreebtree=newBtree();
btree.setData(data);
returnbtree;
}
publicvoidadd(Btreebtree,intdata){
if(data<btree.getData()){
if(btree.getLeft()!=null){
btree=btree.getLeft();
add(btree,data);
}else{
btree.setLeft(create(data));
}
}else{
if(btree.getRight()!=null){
btree=btree.getRight();
add(btree,data);
}else{
btree.setRight(create(data));
}
}
}
//中序遍歷
publicvoidmidSerch(Btreebtree){
if(btree.getLeft()!=null)
midSerch(btree.getLeft());
System.out.print(btree.getData()+"");
if(btree.getRight()!=null)
midSerch(btree.getRight());
}
//二叉樹查找
publicvoidfind(Btreebtree,intdata){
if(btree.getData()>data)
{
if(btree.getLeft()==null)
{
System.out.println("沒有這種結果,搜索完畢");
return;
}else
find(btree.getLeft(),data);
}elseif(btree.getData()==data)
{
System.out.println("查找成功,查找到的數據是"+data);
return;
}else
{
if(btree.getRight()==null){
System.out.println("沒有這種結果,搜索完畢");
return;
}
else
find(btree.getRight(),data);
}
}
}
//主類,與注釋的自己看MidSerchBtree.java
publicclassMidSerchBtree{
publicstaticvoidmain(Stringargs[]){
Toolstools=newTools();
intdatas[]={6,4,3,7,8,9,2,1,5,8,9,12,23,45,3,7,5};
Btreebtree=tools.create(datas[0]);
for(inti=1;i<datas.length;i++){//第一個初始化插入作為根節點了
tools.add(btree,datas[i]);
}
tools.midSerch(btree);//中根遍歷小的插入左邊,大的在右邊,所以,中序遍歷一遍就是排序
tools.find(btree,56);
}
}

Ⅱ java二叉排序樹,已有代碼,如何調通輸出

你好,很高興回答你的問題。

目前已經有了二叉樹以及二叉樹節點的類。

需要一個main方法,在其中創建節點(通過節點類的構造方法),構建樹(通過樹的構造方法以及insert方法)。可以執行查詢的方法以及展示的方法。

如果有幫助到你,請點擊採納。

Ⅲ java寫的關於二叉排序樹的刪除操作的問題

package ggg;

import java.math.BigDecimal;
import java.util.Scanner;
import java.util.Random;
import java.util.Stack;

/**
* 二叉排序樹(又稱二叉查找樹)
* (1)可以是一顆空樹
* (2)若左子樹不空,則左子樹上所有的結點的值均小於她的根節點的值
* (3)若右子樹不空,則右子樹上所有的結點的值均大於她的根節點的值
* (4)左、右子樹也分別為二叉排序樹
*
*
* 性能分析:
* 查找性能:
* 含有n個結點的二叉排序樹的平均查找長度和樹的形態有關,
* (最壞情況)當先後插入的關鍵字有序時,構成的二叉排序樹蛻變為單枝樹。查找性能為O(n)
* (最好情況)二叉排序樹的形態和折半查找的判定樹相同,其平均查找長度和log2(n)成正比
*
*
* 插入、刪除性能:
* 插入、刪除操作間復雜度都O(log(n))級的,
* 即經過O(log(n))時間搜索到了需插入刪除節點位置和刪除節點的位置
* 經O(1)級的時間直接插入和刪除
* 與順序表相比,比序順序表插入刪除O(n)(查找時間O(log(n))移動節點時間O(n))要快
* 與無序順序表插入時間O(1),刪除時間O(n)相比,因為是有序的,所查找速度要快很多
*
*
*
* 作者:小菜鳥
* 創建時間:2014-08-17
*
*/

public class BinarySortTree {

private Node root = null;

/**查找二叉排序樹中是否有key值*/
public boolean searchBST(int key){
Node current = root;
while(current != null){
if(key == current.getValue())
return true;
else if(key < current.getValue())
current = current.getLeft();
else
current = current.getRight();
}
return false;
}

/**向二叉排序樹中插入結點*/
public void insertBST(int key){
Node p = root;
/**記錄查找結點的前一個結點*/
Node prev = null;
/**一直查找下去,直到到達滿足條件的結點位置*/
while(p != null){
prev = p;
if(key < p.getValue())
p = p.getLeft();
else if(key > p.getValue())
p = p.getRight();
else
return;
}
/**prve是要安放結點的父節點,根據結點值得大小,放在相應的位置*/
if(root == null)
root = new Node(key);
else if(key < prev.getValue())
prev.setLeft(new Node(key));
else prev.setRight(new Node(key));
}

/**
* 刪除二叉排序樹中的結點
* 分為三種情況:(刪除結點為*p ,其父結點為*f)
* (1)要刪除的*p結點是葉子結點,只需要修改它的雙親結點的指針為空
* (2)若*p只有左子樹或者只有右子樹,直接讓左子樹/右子樹代替*p
* (3)若*p既有左子樹,又有右子樹
* 用p左子樹中最大的那個值(即最右端S)代替P,刪除s,重接其左子樹
* */
public void deleteBST(int key){
deleteBST(root, key);
}
private boolean deleteBST(Node node, int key) {
if(node == null) return false;
else{
if(key == node.getValue()){
return delete(node);
}
else if(key < node.getValue()){
return deleteBST(node.getLeft(), key);
}
else{
return deleteBST(node.getRight(), key);
}
}
}

private boolean delete(Node node) {
Node temp = null;
/**右子樹空,只需要重接它的左子樹
* 如果是葉子結點,在這里也把葉子結點刪除了
* */
if(node.getRight() == null){
temp = node;
node = node.getLeft();
}
/**左子樹空, 重接它的右子樹*/
else if(node.getLeft() == null){
temp = node;
node = node.getRight();
}
/**左右子樹均不為空*/
else{
temp = node;
Node s = node;
/**轉向左子樹,然後向右走到「盡頭」*/
s = s.getLeft();
while(s.getRight() != null){
temp = s;
s = s.getRight();
}
node.setValue(s.getValue());
if(temp != node){
temp.setRight(s.getLeft());
}
else{
temp.setLeft(s.getLeft());
}
}
return true;
}

/**中序非遞歸遍歷二叉樹
* 獲得有序序列
* */
public void nrInOrderTraverse(){
Stack<Node> stack = new Stack<Node>();
Node node = root;
while(node != null || !stack.isEmpty()){
while(node != null){
stack.push(node);
node = node.getLeft();
}
node = stack.pop();
System.out.println(node.getValue());
node = node.getRight();
}
}

public static void main(String[] args){
BinarySortTree bst = new BinarySortTree();
/**構建的二叉樹沒有相同元素*/
int[] num = {4,7,2,1,10,6,9,3,8,11,2, 0, -2};
for(int i = 0; i < num.length; i++){
bst.insertBST(num[i]);
}
bst.nrInOrderTraverse();
System.out.println(bst.searchBST(10));
bst.deleteBST(2);
bst.nrInOrderTraverse();
}

/**二叉樹的結點定義*/
public class Node{
private int value;
private Node left;
private Node right;

public Node(){
}
public Node(Node left, Node right, int value){
this.left = left;
this.right = right;
this.value = value;
}
public Node(int value){
this(null, null, value);
}

public Node getLeft(){
return this.left;
}
public void setLeft(Node left){
this.left = left;
}
public Node getRight(){
return this.right;
}
public void setRight(Node right){
this.right = right;
}
public int getValue(){
return this.value;
}
public void setValue(int value){
this.value = value;
}
}

}

Ⅳ 如何在java中創建二叉排序樹

試試這些代碼:
private BinaryNode<T> remove(T x,BinaryNode<T> p,BinaryNode<T> parent){
if(p==null){
return null;
}
if(x.compareTo(p.data)>0){
return remove(x,p.left,p);
}
if(x.compareTo(p.data)<0){
return remove(x,p.right,p);
}
if(p.left!=null&&p.right!=null){
BinaryNode<T> insucc=p.right;

while(insucc.left!=null){
insucc=insucc.left;
}
p.data=insucc.data;
return remove(p.data,p.right,p);
}
if(parent==null){
if(p.left!=null){
root=p.left;
}
else root=p.right;
return p;
}
if(p==parent.left){
if(p.left!=null){
parent.left=p.left;
}
else{
parent.left=p.right;
}
}
else{
if(p.left!=null){
parent.right=p.left;
}
else{
parent.right=p.right;
}
}
return p;
}

Ⅳ java如何創建一顆二叉樹

計算機科學中,二叉樹是每個結點最多有兩個子樹的有序樹。通常子樹的根被稱作「左子樹」(left subtree)和「右子樹」(right subtree)。二叉樹常被用作二叉查找樹和二叉堆或是二叉排序樹。

二叉樹的每個結點至多隻有二棵子樹(不存在度大於2的結點),二叉樹的子樹有左右之分,次序不能顛倒。二叉樹的第i層至多有2的 i -1次方個結點;深度為k的二叉樹至多有2^(k) -1個結點;對任何一棵二叉樹T,如果其終端結點數(即葉子結點數)為n0,度為2的結點數為n2,則n0 = n2 + 1。

樹是由一個或多個結點組成的有限集合,其中:

⒈必有一個特定的稱為根(ROOT)的結點;

二叉樹
⒉剩下的結點被分成n>=0個互不相交的集合T1、T2、......Tn,而且, 這些集合的每一個又都是樹。樹T1、T2、......Tn被稱作根的子樹(Subtree)。

樹的遞歸定義如下:(1)至少有一個結點(稱為根)(2)其它是互不相交的子樹

1.樹的度——也即是寬度,簡單地說,就是結點的分支數。以組成該樹各結點中最大的度作為該樹的度,如上圖的樹,其度為2;樹中度為零的結點稱為葉結點或終端結點。樹中度不為零的結點稱為分枝結點或非終端結點。除根結點外的分枝結點統稱為內部結點。

2.樹的深度——組成該樹各結點的最大層次。

3.森林——指若干棵互不相交的樹的集合,如上圖,去掉根結點A,其原來的二棵子樹T1、T2、T3的集合{T1,T2,T3}就為森林;

4.有序樹——指樹中同層結點從左到右有次序排列,它們之間的次序不能互換,這樣的樹稱為有序樹,否則稱為無序樹。

樹的表示
樹的表示方法有許多,常用的方法是用括弧:先將根結點放入一對圓括弧中,然後把它的子樹由左至右的順序放入括弧中,而對子樹也採用同樣的方法處理;同層子樹與它的根結點用圓括弧括起來,同層子樹之間用逗號隔開,最後用閉括弧括起來。如右圖可寫成如下形式:
二叉樹
(a( b(d,e), c( f( ,g(h,i) ), )))

Ⅵ 計算機C語言數據結構javaIT二叉排序樹的構造

字元串的大小是逐字元比較,比較字元的ascii碼。
排序樹,可以是左樹比根節點大,右樹比它小,或者反過來也行。這樣就是有序的,可以從根開始查找串。

熱點內容
手機存儲卡速度測試 發布:2025-02-08 17:02:57 瀏覽:23
洪恩編程 發布:2025-02-08 17:02:19 瀏覽:811
linux遠程式控制制 發布:2025-02-08 17:02:16 瀏覽:151
珠心算演算法 發布:2025-02-08 17:00:37 瀏覽:915
動態ip可以做伺服器么 發布:2025-02-08 17:00:33 瀏覽:217
oracle定義存儲過程 發布:2025-02-08 16:54:35 瀏覽:149
mac玩飢荒要什麼配置 發布:2025-02-08 16:52:18 瀏覽:681
androidattributeset 發布:2025-02-08 16:51:23 瀏覽:423
c語言調用函數返回值 發布:2025-02-08 16:51:19 瀏覽:789
有壓縮錢嗎 發布:2025-02-08 16:34:01 瀏覽:517