二叉查詢樹 BinarySearchTree

2021-08-17 14:30:33 字數 2845 閱讀 5812

一、定義tree介面

public inte***ce treeextends iterable
二、實現抽象便利類abstracttree

public abstract class abstracttreeimplements tree

@override

public void preorder()

@override

public void postorder()

@override

public boolean isempty()

}

三、實現bst

public class binarysearchtree> extends abstracttree

public binarysearchtree(e objects)

}public treenodegetroot()

public static class treenode>

}protected treenodecreatenewnode(e e)

@override

public boolean search(e e)

else if(e.compareto(current.element) < 0)

else

return true;

}return false;

}@override

public boolean insert(e e)

else if(e.compareto(current.element) < 0)

else

return false; //不能插入相同元素

}if (e.compareto(parent.element) > 0)

else

}size++;

return true;

}@override

public boolean delete(e e)

else if (e.compareto(current.element)<0)

else break;

}if (current == null) return false; //元素不在二叉樹中

if(current.leftnode == null)

}else

current.element = rightmost.element; //把左子樹中最大的節點替換掉要刪掉的節點

if (parentofrightmost == current)

parentofrightmost.leftnode = rightmost.leftnode;

else

parentofrightmost.rightnode = rightmost.leftnode;

}size--;

return true;

}@override

public void inorder()

protected void inorder(treenoderoot)

@override

public void preorder()

protected void preorder(treenoderoot)

@override

public void postorder()

protected void postorder(treenoderoot)

@override

public int getsize()

@override

public void clear()

private class inorderiterator implements iterator

private void inorder()

private void inorder(treenoderoot)

@override

public void remove()

@override

public boolean hasnext()

return list;

}}

四、總結

1.前序、中序、後序遍歷的時間複雜度都是o(n),因為每個節點都要遍歷一次。查詢、刪除和插入的時間複雜度是樹的高度。在最差的情況下,樹的高度為o(n)但如果是平衡二叉樹,高度則是o(logn)

2.如果是平衡二叉樹,樹的大部分操作需要從上至下一層層的查詢樹的節點,對於一棵滿樹,大約有一半的節點處於最底層(最底層節點數 = 其它層節點數的和 + 1),故節點操作大約有一半需要找到最底層節點,大約有四分之一的節點處於倒數第二層,故節點操作大約有四分之一需要找到倒數第二層節點,依此類推

查詢過程中,需要訪問每一層的節點,故只要知道了查詢的層數,就能知道操作所需的時間,如果節點總數為n,層數為l,l=log2(n+1)

如果為查詢操作或刪除操作,被操作的節點可能是是樹的任意節點,故查詢操作或刪除操作的時間複雜度為:1/21*log2(n+1) + 1/22*log2(n/2+1) + ... + 1/2n*1

如果為插入操作,由於每次都在樹的最低層插入新的節點,故插入操作的時間複雜度為:log2(n+1)

總的來說可以認為二叉搜尋樹操作的時間複雜度為為o(logn)

如果樹不是一棵滿樹,則判斷起來比較複雜,但是如果層數相同,對滿樹的操作肯定比對不滿樹的操作更耗時

對於乙個含有10000個資料項的有序鍊錶,查詢操作平均需要比較5000次,對於乙個含有10000個節點的二叉搜尋樹,查詢操作大約需要13次

可以看出,二叉搜尋樹集合了有序鍊錶插入刪除效率高和有序陣列查詢效率高的優點

二叉樹 二叉查詢樹

構建二叉樹,判斷是否為二叉查詢樹,遞迴先序遍歷,非遞迴中序遍歷 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 ...