二叉树初始化_Java实现二叉树
二叉查找樹
二叉查找樹(Binary Search Tree)也叫排序樹或有序樹或搜索樹,它是為實現快速查找而生。二叉查找樹的左子樹的節點都小于它的父節點,右子樹中的節點都大于它的父節點,因此若按中序遍歷,要進行從小到大的排序。
無論是空樹,還是二叉查找樹,都有嚴格的定義:
若左子樹不空,則左樹上所有節點的值均小于它的根節點的值;若右子樹不空,則右樹上所有節點的值均小于它的根節點的值;左、右樹也分別為二叉查找樹,沒有鍵值相等的節點。
二叉樹查找的時間復雜度最壞的情況下類似鏈表為O(n),而在一般平衡狀態下一般都會接近O(logn),從時間復雜度來看是一種比較出色的查找的數據結構。而在插入操作中由于只能插入在葉子上也類似查找的時間復雜度。但是二叉查找樹在刪除時要分為三種情況:
二叉查找樹刪除時的三種情況
1、被刪除結點沒有子結點:直接將其父結點對應的左子樹或右子樹設置為 null。如刪除結點 E 時,pp.left = null 或 pp.right = null。
2、被刪除結點只有一個子結點:直接將其父結點指向被刪除結點的左子樹或右子樹。如刪除結點 D 時,pp.left = p.left 或 pp.right = p.right。
3、被刪除結點有兩個子結點:此時刪除比較復雜,需要先從被刪除結點的右子樹查找最小值結點 p2 賦值給被刪除結點。這樣就變成刪除這個右子樹查找最小值結點 p2 的問題,同第一種情況完全一樣。如刪除結點 B 時,需要在其右子樹中查找一個最小的值結點 F,將 B 對應結點的值替換成 F,然后再刪除 F。
二叉查找樹的時間復雜度都和樹的高度息息相關,也就是 O(height)。如果滿足平衡二叉樹時樹高度為 logn,如果退化成鏈表時樹高度為 n,而深度(高度)為k的二叉樹至多有2^k-1個結點。
用Java實現二叉樹的順序存儲
1、對于完全二叉樹,若從上往下,從左到右,則編號為i的結點,其左孩子編號必定為2i,其右邊孩子編號必定為2i+1,其雙親結點編號必定為i/2。
2、第i層有2^(i-1)個結點(i為深度)。
3、對于任何一棵二叉樹,若2度的結點數有n2個,則葉子樹n0必定為n2+1(即n0=n2+1)。
實現代碼:
初始化定義深度,長度以及存儲數組
構造無參構造器,傳入深度參數的構造器,以及傳入參數深度和根結點的構造器
添加初始化結點
判斷二叉樹是否為空
返回指定結點的值
返回指定結點的父節點
添加指定結點的左節點
添加指定結點的右節點
返回指定結點的左節點
返回指定結點的右節點
在主函數中實現操作并輸出結果
運行結果截圖
二叉查找樹對比散列表(哈希表)
在不考慮哈希沖突的情況下散列表的插入、刪除、查找的時間復雜度都是 O(1),而二叉查找樹在平衡情況下為O(logn)。那么二叉查找樹的優勢相對于散列表在哪里呢?
1、散列表有一個最明顯的問題就是其中的數據均為無序數據,如果我們對一組數據的順序有要求時,我們要對散列表中的順序進行排列,而二叉查找樹法僅需要進行中序遍歷就可獲得有序數據。
2、散列表擴容耗時很多,而且當遇到散列沖突時,性能不穩定。而盡管二叉查找樹的性能不穩定,但是在工程中,我們最常用的平衡二叉查找樹的性能非常穩定,時間復雜度穩定在 O(logn)。
3、盡管散列表的查找等操作的時間復雜度是常量級的,但因為哈希沖突的存在,這個常量不一定比 logn 小,所以實際的查找速度可能不一定比 O(logn) 快。加上哈希函數的耗時,也不一定就比平衡二叉查找樹的效率高。
4、散列表的構造比二叉查找樹要復雜,需要考慮的東西很多。比如散列函數的設計、沖突解決辦法、擴縮容等。平衡二叉查找樹只需要考慮平衡性這一個問題,而且這個問題的解決方案比較成熟、固定。
所以我們面對一個數據大小不太大不容易發生哈希沖突且對速度有高要求的問題時,可以采用散列表。但是在解決對速度穩定性有高要求的問題時,便可以考慮使用二叉查找樹這個穩定的解決方案。
文章轉自:小組19級成員--程天翼
總結
以上是生活随笔為你收集整理的二叉树初始化_Java实现二叉树的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python自动化测试数据驱动_利用Py
- 下一篇: windows下配置odbc时useri