一、先序遍歷非遞迴實現
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 ...