對於樹(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個結點的二叉樹。則此二叉樹稱為 滿二叉...