演算法 二叉樹遍歷 廣度,棧 非遞迴,Morris

2021-10-03 07:58:23 字數 1643 閱讀 6972

static

void

bfs(node root)

if(node.right!=null)

}}

static

void

iterativepreorder

(node root)

}

static

void

stackpreorder

(node root)

else

}}

static

void

stackinorder

(node root)

else

}}

static

void

stackpostorder

(node root)

while

(!stack2.

isempty()

)}

static

void

stackpostorder

(node root)

cur= stack.

pop();

//當前左孩子是空或者被訪問過,還需要判斷右孩子是否為空或被訪問過,滿足條件即可列印當前(根)結點

if(cur.right==null||cur.right==lastvisited)

//右孩子未被訪問過,把當前結點設定為其右孩子,進行下次迭代

else

}}

static

void

morrisinorder

(node root)

else

//已經遍歷過左子樹了,把左子樹的最右葉子節點線索清除,開始遍歷右子樹

if(pre.right==cur)

//設定左子樹最右葉子節點的線索為當前節點,即當前節點的前驅,開始遍歷左子樹

else}}

}

static

void

morrispreorder

(node root)

else

//已經遍歷過左子樹了,把左子樹的最右葉子節點線索清除,開始遍歷右子樹

if(pre.right==cur)

//設定左子樹最右葉子節點的線索為當前節點,即當前節點的前驅,列印當前節點後,開始遍歷左子樹

else}}

}

static

void

morrispostorder

(node root)

else

//已經遍歷過左子樹了,把左子樹的最右葉子節點線索清除,開始遍歷右子樹

if(pre.right==cur)

//設定左子樹最右葉子節點的線索為當前節點,即當前節點的前驅,開始遍歷左子樹

else}}

reverseprint

(root);}

static

void

reverseprint

(node node)

}

二叉樹遍歷 非遞迴演算法

文庫文章 二叉樹前序遍歷 根 左結點 右結點 所以在訪問到乙個節點不為空時 先訪問此結點,然後把此結點的非空右孩子先入棧,然後再把非空左孩子入棧。具體 如下 二叉樹後序非遞迴演算法 第二種思路 要保證根結點在左孩子和右孩子訪問之後才能訪問,因此對於任一結點p,先將其入棧。如果p不存在左孩子和右孩子,...

二叉樹遍歷非遞迴演算法

輸入 include include define maxsize 100 typedef char elemtype using namespace std typedef struct node btnode 建立二叉樹 void createbtnode btnode b,char str j...

二叉樹遍歷非遞迴演算法

遞迴演算法非常的簡單。先訪問跟節點,然後訪問左節點,再訪問右節點。如果不用遞迴,那該怎麼做呢?仔細 一.先序遍歷 看一下遞迴程式,就會發現,其實每次都是走樹的左分支 left 直到左子樹為空,然後開始從遞迴的最深處返回,然後開始恢復遞迴現場,訪問右子樹。由於一直走到最左邊後,需要逐步返回到父節點訪問...