java演算法之二叉樹排序

2021-08-21 11:15:10 字數 1329 閱讀 3573

對於樹(adt)形結構,元素的排序不是重點,如果需要排序,一般使用鍊錶、棧、佇列等資料結構。

演算法中常用二叉樹,對於二叉樹排序這裡先不介紹,給個傳送門

在這裡講一下二叉樹的遍歷。

二叉樹的遍歷按當前節點分為三類:

1.前序遍歷dlr  d是當前節點 l在d左邊 r在d右邊 (這其中lr是可以交換的,因為正常是六種遍歷)

2.中序遍歷ldr

3.後序遍歷lrd

還有一種遍歷方法不需要依賴上述順序,即層續遍歷,也就是按照層級一層一層的遍歷

1.前序遍歷dlr

步驟如下:

1)訪問根節點

2)按照遍歷方式遍歷左子樹

3)遍歷右子樹

**如下: 為了方便直接寫中文名的方法了哈~.~

private static void 前序遍歷(binarytreenode a)

從方法中可以看出,應用了遞迴方法不斷的尋找每個節點的左子樹和右子樹。

那如果正常考慮來遍歷呢?請看如下

private static void 非遞迴前序遍歷(binarytreenode a)

if(s.isempty())

a = s.pop();

a = a.getright();}}

以上**是非遞迴版的前序遍歷,應用了棧的思想,把每個具有左子樹的節點壓入到棧中, 遍歷之後取出節點 找到其右子樹。這樣有人會問,那麼如果右子樹節點包含了左子樹那麼遍歷時是否會忽略呢,答案是:不會 因為在重新尋找右子樹節點的時候沒有重新定義變數,所以右子樹的做節點還是會接著進行遍歷的。

2.中序遍歷 ldr

顧名思義,還是先遍歷左子樹在遍歷當前節點,然後遍歷右子樹。**如下:

private static void 遞迴中序遍歷(binarytreenode a)

依舊,遞迴也是最好理解且最簡單的 主函式如下:

public static void main(string args)

if(s.isempty())

s.pop();

system.out.println(a.getdata());

a = a.getright();}}

可以看出,在非遞迴中,是否出棧和進棧時輸出資料可判斷是什麼遍歷。

3.後續遍歷

遞迴方案這裡就不贅述啦,相信小夥伴們也已經看懂了,這裡詳細說一下後續遍歷的非遞迴版本。

在非遞迴中前序和中序都很好做,但後續要考慮如何最後輸出當前節點,其具體**如下

private static void 非遞迴後序遍歷(binarytreenode a) elseelse

}if(!s.isempty())else}}

}}

演算法基礎之二叉樹

本文主要包括樹相關的演算法,二叉樹結點基本結構如下 function treenode x 本文還會繼續更新。function depth proot var depth 0 var currdepth 0 dfs proot return depth function dfs node currd...

二叉樹之 二叉樹深度

二叉樹深度 獲取最大深度 public static int getmaxdepth treenode root 二叉樹寬度 使用佇列,層次遍歷二叉樹。在上一層遍歷完成後,下一層的所有節點已經放到佇列中,此時佇列中的元素個數就是下一層的寬度。以此類推,依次遍歷下一層即可求出二叉樹的最大寬度 獲取最大...

樹之二叉樹

二叉樹是每個結點最多有兩個子樹的有序樹。通常子樹的根被稱作 左子樹 left subtree 和 右子樹 right subtree 二叉樹常被用作二叉查詢樹和二叉堆或是二叉排序樹。滿二叉樹 在二叉樹的第i 層上有2 i 1 個結點,深度為k的二叉樹有2 k 1個結點的二叉樹。則此二叉樹稱為 滿二叉...