#include <iostream>
#include <stack>
using namespace std;
struct TreeNode
{
char val;
TreeNode *left;
TreeNode *right;
TreeNode(char x):val(x),left(NULL),right(NULL)
{
}
};
//前序
void preorder(TreeNode* root)
{
if(root==NULL)
cout<<"The tree is empty!"<<endl;
stack<TreeNode*> s;
while(root||!s.empty())
{
while(root)
{
cout<<root->val<<endl;
s.push(root);
root=root->left;
}
root=s.top();
s.pop();
root=root->right;
}
}
//中序
void midorder(TreeNode* root)
{
if(root==NULL)
{
cout<<"The tree is empty!"<<endl;
}
stack<TreeNode*> s;
while(root||!s.empty()){
while(root){
s.push(root);
root=root->left;
}
root=s.top();
s.pop();
cout<<root->val;
root=root->right;
}
}
void postorder(TreeNode* root){
if(root==NULL)
cout<<"empty!"<<endl;
else{
stack<TreeNode*> s;
stack<int> v;
//跟中序一样,把所以的左子树先放到栈里,这边多了一个标志而已
while(root)
{
s.push(root);
v.push(0);
root=root->left;
}
while(!s.empty()){
root=s.top();
while(root->right&&v.top()==0) //遍历所以的右子树
{
v.pop();
v.push(1);
root=root->right;
s.push(root)
v.push(0);
while(root->left)
{
s.push(root);
v.push(0);
root=root->left;
}
}
root=s.top();
cout<<root->val;
s.pop();
v.pop();
}
}
}
int main()
{
TreeNode G('G');
TreeNode H('H');
TreeNode D('D');
TreeNode B('B');
TreeNode I('I' );
TreeNode E('E');
TreeNode F('F' );
TreeNode C('C');
TreeNode A('A');
A.left = &B;
A.right = &C;
B.left = &D;
D.left = &G;
D.right = &H;
C.left = &E;
C.right = &F;
E.right = &I;
//preorder(&A);
//midorder(&A);
postorder(&A);
system("pause");
return 0;
}
二叉树前序中序后序非递归写法
最新推荐文章于 2022-10-27 13:32:48 发布