【题意】
给出一个非递归输出二叉树中序遍历的方法,根据这种方法建立二叉树并输出此二叉树的后序遍历
【思路】
找出利用栈输出中序遍历的规律即可建树:
· push时若之前节点无左子树就插在之前节点的左子树上,否则插入右子树;
· pop时要记录弹出的栈顶节点
后序遍历递归实现即可
#include <iostream>
#include <vector>
#include <stack>
#include <string>
using namespace std;
typedef struct node{
int value;
node *left;
node *right;
node(int v):value(v),left(NULL),right(NULL){};
}BiNode;
int cnt;
void PostOrderTraversal(BiNode *node){
if(node->left!=NULL){
PostOrderTraversal(node->left);
}
if(node->right!=NULL){
PostOrderTraversal(node->right);
}
cout << node->value;
if(--cnt){
cout << " ";
}
}
int main(int argc, char const *argv[])
{
vector<BiNode> nodes;
stack<BiNode*> ss;
BiNode *tmp,*head;
int n;
cin >> n;
tmp = NULL;
for(int i=0; i<2*n; i++){
string com;
cin >> com;
if(com=="Push"){
int value;
cin >> value;
if(tmp==NULL){
tmp = new BiNode(value);
head = tmp;
}
else if(tmp->left==NULL){
tmp->left = new BiNode(value);
tmp = tmp->left;
}
else{
tmp->right = new BiNode(value);
tmp = tmp->right;
}
ss.push(tmp);
}
//Pop
else{
tmp = ss.top();
ss.pop();
}
}
cnt = n;
PostOrderTraversal(head);
system("pause");
return 0;
}