您的位置:首页 > 其它

非递归方法,二叉树的中序遍历

2015-10-25 10:52 381 查看
#include<iostream>
#include<stack>
#include<vector>
#include<string>
using namespace std;
typedef struct Bintree* tree;//tree是指向结构体的指针
struct Bintree
{
char c;
tree lchild,rchild;
};
tree creat(tree root)
{
char ch;
ch=getchar();
if(ch=='#')
root=NULL;
else
{
root=(tree)malloc(sizeof(struct Bintree));
root->c=ch;
root->lchild=creat(root->lchild);
root->rchild=creat(root->rchild);
}
return root;
}
void InTravsal(tree tree1)//二叉树的中序遍历
{
if(tree1!=NULL)
{
InTravsal(tree1->lchild);
cout<<tree1->c;
InTravsal(tree1->rchild);

}
}
int main()
{
tree root1;//根节点
root1=(tree)malloc(sizeof(struct Bintree));
root1=creat(root1);
stack<tree>sta;
tree test1,test;
test=root1;
while(test)
{
sta.push(test);//将根节点F压入栈
test1=test->lchild;//test1指向左子树根节点的指针,即为空
if(test1==NULL)//如果左子树根节点为空,即没有左子树
{
if(test!=NULL)//指向该节点的指针不为空,即F不为空
cout<<test->c<<endl;//输出该节点的字符,即输出F
sta.pop();//将该节点弹出,将F节点弹出
if(test->rchild==NULL)//判断该节点的右子树根节点是不是空,如果是空,F的右子树为空
{
if(sta.size()!=0)//判断此时栈的大小,如果不等于零
{
cout<<sta.top()->c<<endl;//输出该节点的字符,输出D
if(sta.top()->rchild!=NULL)//D的右子树不为为空
{
test=sta.top()->rchild;
sta.pop();
}
else//D的右子树为空
{
sta.pop();//D弹出
cout<<sta.top()->c<<endl;
test=sta.top()->rchild;
sta.pop();

}

}
else
{
test=NULL;
}
}
else
test=test->rchild;
}
else
test=test->lchild;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: