二叉樹的先序,中序,後序遍歷(遞迴版與非遞迴版本)

2021-09-25 16:32:13 字數 1561 閱讀 1642

先序遍歷:先遍歷當前節點,再遍歷當前節點的左孩子,在遍歷當前節點的有孩子

把列印的時機放到第幾次遍歷這個節點,對應不同的遍歷

當第一次來到這個節點的時候,對應先序遍歷

當第二次來到這個節點的時候,對應中序遍歷

當第三次來到這個節點的時候,對應後續遍歷

遞迴版

/先序遍歷

public static void preorderrecur(node head)

system.out.print(head.value + " ");

preorderrecur(head.left);

preorderrecur(head.right);

}//中序遍歷

public static void inorderrecur(node head)

inorderrecur(head.left);

system.out.print(head.value + " ");

inorderrecur(head.right);

}//後續遍歷

public static void posorderrecur(node head)

posorderrecur(head.left);

posorderrecur(head.right);

system.out.print(head.value + " ");

}

非遞迴版

先序遍歷:首先建立乙個棧,用於儲存節點,先將根節點儲存到棧中,判斷棧是否為空,在將棧中元素彈出,賦值給樹,並列印當前節點,並判斷當前節點的有子樹是否為空,若不為空,則將當前節點的左子樹壓入棧中,再判斷當前節點的左子樹是否為空,若不為空,將當前節點的左子樹壓入棧中。

public static void preorderunrecur(node head) 

if (head.left != null) }}

system.out.println();

}

中序遍歷:建立乙個棧,判斷棧或樹節點是否為空,再判斷當前節是否為空,若不為空,將當前節點壓如棧中,當前節點指向當前節點的左子樹,如果當前節點為空,棧彈出節點,列印棧彈出的節點,當前節點指向當前節點的右子樹。

public static void inorderunrecur(node head)  else }}

system.out.println();

}

後續遍歷:由於後續遍歷是第三次來到節點,但是棧只能兩次訪問節點,因此另闢蹊徑

首先根據先序遍歷,很容易實現的是 當前節點,右子樹,左子樹的遍歷順序,因此新建乙個棧,儲存另乙個棧中彈出的結點,訪問結束後進行列印,因此可以得到先左子樹,再右子樹,最後根節點的遍歷順序。

public static void posorderunrecur1(node head) 

if (head.right != null)

}while (!s2.isempty())

}system.out.println();

}

二叉樹先序 中序 後序遍歷

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

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

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

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

從根部 a 開始,然後開始遍歷左子樹,直接找到 b 檢視 b 有沒有左子樹,有 d,再檢視 d 有沒有子樹,沒有,d 已經是葉子,所以第二個是 d。倒回去,取中 b,第三個數是 b。檢視 b 有沒有右子樹,有 e 檢視 e 有沒有子樹,有 g 左 h 右 所有後面三個數是 egh 先查左子樹,存在繼...