二叉樹的四種遍歷(遞迴與非遞迴)

2022-10-04 01:36:11 字數 1859 閱讀 1492

先序遍歷根節點,再遍歷左子樹,再遍歷右子樹。

後序遍歷先遍歷左子樹,再遍歷右子樹,再遍歷根節點。

先序遍歷遞迴實現:

public static void preorderbyrecursion(treenode root)
先序遍歷的非遞迴實現:

非遞迴實現需要借助棧這樣乙個資料結構,實際上遞迴實現也是依靠棧,只不過是隱式的。

先將根節點壓入棧中。

彈出棧中的節點,將彈出節點的右子節點壓入棧中,再將彈出節點的左子樹壓入棧中。

重複步驟2,直到棧為空。

public static void preorder(treenode root) 

stackstack = new stack<>();

stack.push(root);

while (!stack.empty())

if (node.left != null)

}}

後序遍歷遞迴實現:先序遍歷反過來,就不贅述了。

public static void postorderbyrecursion(treenode root)
後序遍歷非遞迴實現:後序遍歷就是先序遍歷反過來,所以需要兩個棧,多出來的棧用來反向輸出。

public static void postorder(treenode root) 

stacks1 = new stack<>();

stacks2 = new stack<>();

s1.push(root);

while (!s1.empty())

if (node.right != null)

}while (!s2.empty())

}

中序遍歷先遍歷左子樹,再遍歷根節點,再遍歷右子樹。

遞迴遍歷:

public static void inorderbyrecursion(treenode root) 

inorderbyrecursion(root.left);

// 列印節點值

system.out.println(root.value);

inorderbyrecursion(root.right);

}

非遞迴遍歷:

將二叉樹的左側「邊」從上到下依次壓入棧中。

從棧中彈出節點

對以彈出節點的右子節點為根節點的子樹,重複步驟1。

重複2、3步驟,直到棧為空。

public static void inorder(treenode root) 

stackstack = new stack<>();

treenode cur = root;

while (cur != null)

while (!stack.empty())

}}

層序遍歷顧名思義就是一層一層,從左到右的遍歷二叉樹。需要用到佇列這一資料結構。

將根節點推入佇列。

從佇列中取出乙個節點。

先將取出節點的左子節點推入佇列,再將取出節點的右子節點推入佇列。

重複2、3步驟直到佇列中無節點可取。

public static void floororder(treenode root) 

queuequeue = new linkedlist<>();

queue.add(root);

while (!queue.isempty())

if (node.right != null)

}}

二叉樹的遞迴遍歷與非遞迴遍歷

二叉樹的遞迴遍歷與非遞迴遍歷 include include include 本程式實現二叉樹的建立,遞迴遍歷與非遞迴遍歷 typedef struct tnode tnode,pnode 構造二叉樹 pnode createtree else pnode data data pnode lchil...

二叉樹的遞迴遍歷與非遞迴遍歷

二叉樹的遍歷有遞迴與非遞迴兩種方式,但思想大致相同 前序 先列印然後遍歷完他的左子樹,左子樹為空時開始返回,並且開始以棧中元素為根遍歷右子樹 中序 先遍歷左子樹然後左子樹入棧,左子樹為空再列印,再遍歷右子樹 後序 先遍歷完左子樹,左子樹入棧儲存,再遍歷右子樹,遍歷完列印,否則繼續入棧 遞迴遍歷 遞迴...

二叉樹遍歷(遞迴 非遞迴)

二叉樹以及對二叉樹的三種遍歷 先根,中根,後根 的遞迴遍歷演算法實現,以及先根遍歷的非遞迴實現。node public class node public node left public node right public object value 遍歷訪問操作介面 public inte ce ...