二叉樹的遍歷 (遞迴 棧)

2021-10-04 23:20:45 字數 2191 閱讀 4072

二叉樹的遍歷可分為兩種:深度遍歷和廣度遍歷

深度遍歷又分為三種:前序、中序、後序遍歷,這三種遍歷方式可以用遞迴或棧來實現

廣度遍歷:即層序遍歷, 可以用佇列來實現

以如下的二叉樹為例,遍歷該二叉樹。

a.建立節點類

public class treenode 

}

b.根據二叉樹圖建立節點集合

public static void main(string args)
c.遍歷二叉樹

//前序遍歷

public static void preorder(treenode tn)

system.out.print(tn.data+" ");

preorder(tn.leftchild);

preorder(tn.rightchild);

}//中序遍歷

public static void inorder(treenode tn)

inorder(tn.leftchild);

system.out.print(tn.data+" ");

inorder(tn.rightchild);

}//後序遍歷

public static void postorder(treenode tn)

postorder(tn.leftchild);

postorder(tn.rightchild);

system.out.print(tn.data+" ");

}

d.遍歷結果

3 2 9 1 8 5 7 

2 1 9 8 3 5 7

1 8 9 2 7 5 3

與遞迴不同的是,使用棧來遍歷二叉樹屬於使用中間變數-棧來輔助遍歷,步驟a、b與使用遞迴遍歷的相同

c.遍歷二叉樹

1、前序:入棧就列印輸出節點資料,即節點訪問的順序等於遍歷順序(從根節點開始訪問,先訪問左子樹,若左子樹不為空則把該左子樹對應的 節點x 入棧,繼續訪問 節點x 的左子樹。迴圈直到左子樹為空,假設當前節點為y。則節點y出棧,訪問節點y的右子樹。繼續迴圈直到棧為空)

stackstack = new stack();

treenode tn=root;

while(tn!=null||!stack.isempty())

tn = stack.pop();

tn = tn.rightchild;

}

2、中序:出棧就列印節點資料,即節點出棧順序等於遍歷順序(其他的與前序相同)

stackstack = new stack();

treenode tn=root;

while(tn!=null||!stack.isempty())

tn = stack.pop();

system.out.print(tn.data+" ");

tn = tn.rightchild;

}

3、後續:增加乙個輔助棧,記錄所有節點(與前序不同的地方在於,先遍歷右子樹,將訪問到的所有節點入棧2,棧2的出棧順序就是遍歷順序)

stackstack = new stack();

stackstack2 = new stack();

tn=root;

while(tn!=null||!stack.isempty())

tn = stack.pop();

tn = tn.leftchild;

}int n = stack2.size();

for (int i = 0; i < n; i++)

d.結果

3 2 9 1 8 5 7 

2 1 9 8 3 5 7

1 8 9 2 7 5 3

層序遍歷, 可以用佇列來實現

//層序遍歷

public static void levelorder(treenode tn)

}

遞迴遍歷二叉樹

include include include 二叉鍊錶表示法 typedef struct tag bitnode bitnode 先序遍歷 void xianxuorder bitnode root 先根 printf c root data 左子樹 xianxuorder root lchil...

二叉樹遞迴遍歷

編寫簡單的程式對下圖二叉樹進行遍歷 先訪問根節點 printf c root ch 再遍歷左子樹 recursion root lchild 再遍歷右子數 recursion root rchild 再遍歷左子樹 recursion root lchild 先訪問根節點 printf c root ...

二叉樹的遞迴遍歷

所謂二叉樹的遍歷,本質上就是沿某條搜尋路徑訪問樹中的每個結點,使得每個節點均被訪問一次,而且僅被訪問一次。由二叉樹的基本定義可以知道,遍歷一顆二叉樹首先必須決定對根結點 n 左子樹 l 右子樹 r 的訪問順序,按照先遍歷左孩子再遍歷右孩子的原則,常見的遍歷次序有先序遍歷 nlr 中序遍歷 lnr 和...