非遞迴二叉樹的遍歷

2021-10-17 08:01:30 字數 1828 閱讀 1935

二叉樹的遞迴遍歷比較簡單,這裡就不聊了。今天主要聊聊二叉樹的非遞迴遍歷,主要借助於「棧」後進先出的特性來儲存節點的順序,先序遍歷和中序遍歷相對來說比較簡單,重點理解後序遍歷。

先看看節點型別:

//二叉樹的節點型別

private

class

node

}

2.先序遍歷。非遞迴先序遍歷的思路如下:

1.先將根節點入棧

2.訪問根節點

3.如果根節點存在右孩子,則將右孩子入棧

4.如果根節點存在左孩子,則將左孩子入棧(注意:一定是右孩子先入棧,然後左孩子入棧)

5.重複2-4

public

void

preorder

(node root)

node tmp=root;

stack

s=new

stack

(); s.

push

(tmp)

;//根節點入棧

while

(!s.

empty()

)//3.如果根節點存在左孩子,則將左孩子入棧

if(p.leftchild!=null)

} system.out.

println()

;}

3.中序遍歷。 非遞迴中序遍歷的思路如下:

1.先將根節點入棧

2.將當前節點的所有左孩子入棧,直到左孩子為空

3.訪問棧頂元素,如果棧頂元素存在右孩子,則繼續第2步

4.重複第2、3步,直到棧為空並且所有的節點都被訪問

public

void

inorder

(node root)

node tmp=root;

stack

s=new

stack

();while

(tmp!=null ||

!s.empty()

)//3.訪問棧頂元素

tmp=s.

pop();

system.out.

print

(tmp.data+

" ")

;//4.如果棧頂元素存在右孩子,則將右孩子賦值給tmp,也就是將右孩子入棧

if(tmp.rightchild!=null)

//否則,將tmp置為null,表示下次要訪問的是棧頂元素

else

} system.out.

println()

;}

4.後序遍歷。 後續遍歷的非遞迴實現思路:

1.根節點入棧

2.將根節點的左子樹入棧,直到最左,沒有左孩子為止

3.得到棧頂元素的值,先不訪問,判斷棧頂元素是否存在右孩子,如果存在並且沒有被訪問,則將右孩子入棧,否則,就訪問棧頂元素

public

void

postorder

(node root)

node tmp=root;

//當前節點

node prev=null;

//上一次訪問的節點

stack

s=new

stack

();while

(tmp!=null ||

!s.empty()

)if(!s.

empty()

)//4.存在沒有被訪問的右孩子

else}}

system.out.

println()

;}

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

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

二叉樹非遞迴遍歷

二叉樹非遞迴遍歷的幾個要點 1 不管前序 中序還是後序,它們的遍歷路線 或者說是回溯路線,先沿左邊一直走到盡頭,然後回溯到某節點,並跳轉到該節點的右孩子 如果有的話 然後又沿著這個有孩子的左邊一直走到盡頭 都是一樣的。2 明確每次回溯的目的。比如,前序回溯的目的是為了訪問右子樹 中序回溯的目的是為了...

非遞迴遍歷二叉樹

中序遞迴遍歷 void inordertrvdigui node pnode 然而,當樹的深度很大 比如16 時 假設為滿二叉樹 樹的節點數為 2 0 2 1 2 2 2 15 2 16 65536,遍歷整個二叉樹意味著有65536次函式呼叫,這將極大地增加程式執行時間。這時,應該採取非遞迴便利二叉...