c++建立二叉樹,後序遍歷非遞迴輸出
阿新 • • 發佈:2021-01-19
技術標籤:資料結構基礎演算法
後序遍歷需要藉助一個pre指標來判定之前走過的路徑。
後序遍歷過程中節點可以訪問的標誌是,當前節點沒有孩子,或者當前節點的前一個節點是左右孩子中的一個。
#include<iostream>
#include<stack>
using namespace std;
struct Node{
char data;
Node *lchild;
Node *rchild;
};
Node*createTree(){
char x;
cin>>x;
if(x=='#')return NULL;
Node *root= new Node;
root->data=x;
root->lchild=createTree();
root->rchild=createTree();
return root;
}
void postTraversal(Node*root) {
stack<Node*>s;
Node *cur;
Node *pre=NULL;
s.push(root) ;
while(!s.empty()){
cur=s.top();
if((cur->lchild==NULL&&cur->rchild==NULL)||
( pre!=NULL&&(pre==cur->lchild||pre==cur->rchild))
){//如果當前節點沒有孩子,或者前一個節點是當前的左右孩子之一,都可以訪問了。
cout<<cur->data<<" ";
s.pop();
pre=cur;
}
else{
if(cur->rchild!=NULL)
s.push(cur->rchild);
if(cur->lchild!=NULL)
s.push(cur->lchild) ;
}
}
}
int main(){
//測試用例:1 2 4 # # 5 # # 3 # #
Node *root=createTree();
postTraversal(root);
return 0;
}