//二叉树的非递归后序遍历
#include<iostream>
#include<stack>
using namespace std;
//二叉树节点
struct Node{
int data;
Node* lch;
Node* rch;
};
//栈中的元素
struct stackNode{
Node* node;
//标记node的右节点是否已遍历,是(mark=1),否(mark=0)
int mark;
};
//栈
stack<stackNode*> s;
//非递归后续遍历
void postOrder(Node *root){
if(root==NULL)
return;
Node* node=root;
while(node!=NULL){
if(node->lch!=NULL||node->rch!=NULL){
stackNode* snode=new stackNode();
snode->node=node;
snode->mark=0;
if(node->lch!=NULL){
//右节点为空时,mark=1;
if(node->rch==NULL)
snode->mark=1;
node=node->lch;
}
else {
node=node->rch;
snode->mark=1;
}
s.push(snode);
}
else{
cout<<node->data<<endl;
//将所有栈顶的左右节点均以遍历过的节点输出并出栈
while(!s.empty()&&s.top()->mark==1){
cout<<s.top()->node->data<<endl;
s.pop();
}
if(!s.empty()){
node=s.top()->node->rch;
s.top()->mark=1;
}
else break;
}
}
}
二叉树的非递归后序遍历
最新推荐文章于 2024-07-17 12:11:36 发布