二叉樹先序 中序 後序遍歷

2021-08-19 16:34:42 字數 1689 閱讀 8238

【題目】

用遞迴和非遞迴方式,分別按照二叉樹先序、中序和後序列印所有的節點。我們約定:先序遍歷順序為根、左、右;中序遍歷順序為左、根、右;後序遍歷順序為左、右、根。

【遞迴實現】

//遞迴遍歷二叉樹

//先序

public

void

preorderrecur(node head)

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

preorderrecur(head.left);

preorderrecur(head.right);

}//中序

public

void

inorderrecur(node head)

inorderrecur(head.left);

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

preorderrecur(head.right);

}//後序

public

void

posorderrecur(node head)

posorderrecur(head.left);

posorderrecur(head.right);

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

}

【非遞迴實現】

//非遞迴實現遍歷二叉樹

//先序

public

void

preorderunrecur(node head)

//①申請棧,頭節點head壓入棧

stackstack=new stack();

stack.add(head);//add()是在尾部追加資料,繼承自vector

//②彈出head,列印該值,然後壓入右孩子、左孩子

while(!stack.isempty())

if(head.left!=null)

}//③重複步驟2,直到stack為空

}//中序

public

void

inorderunrecur(node head)

// ①申請棧

stackstack = new stack();

while (!stack.isempty() || head != null) else

}//④stack為空且cur為空,結束

}

//後序:兩個棧實現

public

void

posorderunrecur(node head)

//1.申請兩個棧,將head壓入s1

stacks1=new stack();

stacks2=new stack();

s1.push(head);

while(!s1.isempty())

if(head.right!=null)

}//3.彈出的節點都壓入s2,重複步驟2,直到s1為空(s1壓入順序:左右,s2壓入順序:中右左)

//4.從s2依次彈出並列印(s2彈出順序:左右中)

while(!s2.isempty())

}

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

輸入二叉樹的先序遍歷序列和中序遍歷序列,輸出該二叉樹的後序遍歷序列。非建二叉樹版本 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 先查左子樹,存在繼...

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

二叉樹先序遍歷 中序遍歷 後序遍歷 include include typedef struct bitnodebitnode,bitree void visit bitnode c 先序遍歷 void preorder bitree t 中序遍歷 void inorder bitree t 後序遍...