【題目】
用遞迴和非遞迴方式,分別按照二叉樹先序、中序和後序列印所有的節點。我們約定:先序遍歷順序為根、左、右;中序遍歷順序為左、根、右;後序遍歷順序為左、右、根。
【遞迴實現】
//遞迴遍歷二叉樹
//先序
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 後序遍...