二叉樹先序 中序 後序 層序遍歷非遞迴實現

2021-10-22 18:41:16 字數 1977 閱讀 2360

一、先序遍歷非遞迴實現

1.先建立乙個棧

2.把根節點放入棧中

3.迴圈取棧頂元素

4.訪問這個元素,並出棧

5.把當前元素的右子樹入棧

6.把當前元素的左子樹入棧

7.迴圈該過程

public static void preordernor(treenode root)

//1.建立乙個棧

stackstack=new stack<>();

//2.根節點入棧

stack.push(root);

//3.迴圈取棧頂元素並且出棧

while (!stack.isempty())

//左子樹入棧

if (cur.left != null)

}}

二、中序遍歷非遞迴實現

1.建立乙個棧

2.建立乙個引用 cur 從 root出發,依次往左走,把一路上遇到的所有節點全部入棧,直到cur遇到null結束這個迴圈

3.取出棧頂元素(相當於最左側節點),訪問這個元素

4.讓cur從當前棧頂元素的右子樹出發,迴圈執行第二步

public static void inordernor(treenode root)

if(stack.isempty())

//如果不為空,取出棧頂元素並訪問

treenode top=stack.pop();

system.out.print(top.val);

//使得cur指向 top的右子樹,繼續重複執行上述操作

cur=top.right;

}}

三、後序遍歷的非遞迴實現

1.先建立乙個棧

2.建立乙個cur引用 從root出發,一路向左走,遇到非空節點就入棧

3.取棧頂元素,這個節點就是最左側子樹的根節點,還需要判定才能決定這個節點是否能直接訪問

a)如果該元素的右子樹為 null,就可以訪問這個節點

b)如果該元素的右子樹非 null,並且該右子樹在之前已經被訪問過(在後序遍歷中,右子樹的根節點是緊挨著根節點的,只要判定後序遍歷中上次訪問的節點是不是當前節點的右子樹即可),就可以訪問該節點。

c)如果該元素的右子樹非 null,並且這個右子樹之前沒有被訪問過,就讓cur指向當前元素的右子樹,重複 2過程。

public static void postordernor(treenode root)

//先建立乙個棧

stackstack=new stack<>();

treenode cur=root;

treenode prev=null;//記錄後序遍歷中的前乙個節點

while(true)

//cur為空的時候,取棧頂元素判斷能不能訪問

if (stack.isempty())

//棧頂元素不一定能訪問,真正訪問到的時候再出棧,通過peek來取到這個元素就行

treenode top=stack.peek();

if(top.right==null || prev==top.right)else

}}

四、層序遍歷的非遞迴實現

1.利用佇列

2.取隊首元素

3.訪問這個元素(列印)

4.取出隊首元素的左子樹入佇列,左子樹入佇列

5.重複執行 2

當隊列為空時,遍歷完成

public static void levelorder2(treenode root)

queuequeue=new linkedlist<>();

queue.offer(root);

while(true)

system.out.print(cur.val);

if(cur.left !=null)

if(cur.right!=null)

}}

二叉樹先序 中序 後序遍歷

題目 用遞迴和非遞迴方式,分別按照二叉樹先序 中序和後序列印所有的節點。我們約定 先序遍歷順序為根 左 右 中序遍歷順序為左 根 右 後序遍歷順序為左 右 根。遞迴實現 遞迴遍歷二叉樹 先序 public void preorderrecur node head system.out.println...

二叉樹的先序,中序,後序遍歷(非遞迴)和層序遍歷

先序遍歷 void btreeprevordernonr btnode root top stacktop s stackpop s cur top right printf n 首先建立乙個棧結構,用於儲存二叉樹的結點。開始遍歷二叉樹,當當前結點或者棧不為空的時候,表示遍歷沒有結束,輸出當前結點 ...

二叉樹先序遍歷 中序遍歷 後序遍歷

輸入二叉樹的先序遍歷序列和中序遍歷序列,輸出該二叉樹的後序遍歷序列。非建二叉樹版本 include includeusing namespace std string preord,inord void rebuild int preleft,int preright,int inleft,int ...