遞迴方式會導致每個節點會經過三次,先序是在第一次經過節點時訪問,中序是第二次經過節點時訪問,後序是第三次經過節點時訪問。
其中較為特殊的是葉子節點,左孩子和右孩子都為空,訪問空樹時什麼都不做就返回。
public
static
void
p(node h)
}
(1)利用棧來進行實現,三種演算法在理解的基礎上進行記憶,作為一種模板,以後遇到具體問題,可以稍加改變,但是大致流程需要記住。
(2)看待二叉樹的兩種角度(遞迴與非遞迴)區別:
先將根節點壓入棧中,方便之後進行追蹤
一些規則:
1)彈出就列印
2)如有右孩子,壓入右
3)如有左孩子,壓入左
4)都沒有則什麼都不幹
public
static
void
p(node head)
if(node.left != null)
//左右孩子為空就什麼也不做}}
}
一些規則:1)只要有左邊界就把樹的左邊界從上往下依次壓入棧中
2)當頭節點走到空時,才走第2條邏輯,彈出節點,列印,來到右樹上繼續執行1)-》第i次與第i+1次迴圈。
特別的:對於葉子節點來說,本身就相當於左邊界上的第乙個節點。
注意:
借助這個演算法,區別迴圈與遞迴。
public
static
void
in(node head)
else
}}
頭左右(先壓右,再壓左)
頭右左(先壓左,再壓右)
左右頭(將上乙個序列反轉,即本來是彈出就列印,現在改為壓入另外乙個棧)
}利用佇列來實現:
public
static
void
level
(node head)
//這裡不能用else if,他們不是二選一的情況,對於乙個結點是都要看左右結點
if(node.right != null)
//如果左右孩子都為空,那麼直接進入下一層迴圈,接著彈出隊頭節點
}}
二叉樹學習(一)二叉樹基礎
最近準備學習一下資料結構,二叉樹當然是必須要了解的了。網上看了一些貼子,順便把重要的內容就記下來了,有需要的同學可以看看,入門看很有幫助。1.1 定義 1.2 結點的度 1.3 結點關係 1.4 結點層次 2.1 定義 2.2 二叉樹特點 每個結點最多有兩顆子樹,所以二叉樹中不存在度大於2的結點。左...
二叉樹遍歷相關
紅黑樹也是二叉樹,這裡只是說明對樹的遍歷訪問。插入 查詢 刪除 等操作參看紅黑樹那裡 1 深度優先搜尋 每種都有遞迴和迭代兩種實現 迭代需要借助stack 前序遍歷 10,6,4,8,14,12,16 中序遍歷 4,6,8,10,12,14,16 如果是二叉排序樹就是輸出排序結果了哈 後序遍歷 4,...
構建二叉樹 遍歷二叉樹
陣列法構建二叉樹 public class main public static void main string args 用陣列的方式構建二叉樹 public static void createbintree 把linkedlist集合轉成二叉樹的形式 for int j 0 j 最後乙個父節...