70,022
社区成员




#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include "stacklink.h" //自己构造的链栈
using namespace std;
/*struct TreeNode//树的节点
{
int data;
struct TreeNode *left;
struct TreeNode *right;
};*/
//typedef struct TreeNode* BTree;
/*二叉树的递归建立
/******************/
BTree creatBTree( BTree root )
{
int data;
scanf( "%d",&data );
if( data==0 ) //结束该子树的建立
{
root=NULL;
}
else
{
root=( BTree )malloc( sizeof( struct TreeNode ) );
root->data=data;
root->left=creatBTree( root->left );
root->right=creatBTree( root->right );
}
return root;
}
void postOrder3(BTree root) //非递归后序遍历
{
STACKLINK s;
BTree cur; //当前结点
BTree pre=NULL; //前一次访问的结点
s.Push(*root);
while(!s.IsEmpty())
{
s.Pop(&cur);
cout<<cur->data<<endl;
if((cur->left==NULL&&cur->right==NULL)||
(pre!=NULL&&
(pre==cur->left||pre==cur->right) ))
{
cout<<cur->data<<" "; //如果当前结点没有孩子结点或者孩子节点都已被访问过
pre=cur;
cout<<pre->data<<endl;
}
else
{
if(cur->right!=NULL)
s.Push(*(cur->right));
if(cur->left!=NULL)
s.Push(*(cur->left));
}
}
}
int main()
{
BTree root;
cout<<"前序构造二叉树:"<<endl;
root=creatBTree( root );
cout<<"非递归后序遍历二叉树:"<<endl;
postOrder3(root); cout<<endl;
return 0;
}
//这是我的头文件
#ifndef STACKLINK_H_INCLUDED
#define STACKLINK_H_INCLUDED
#include<iostream>
using namespace std;
typedef struct TreeNode//树的节点
{
int data;
struct TreeNode *left;
struct TreeNode *right;
}TreeNode,*BTree;
//typedef struct TreeNode* BTree;
struct LNode{
TreeNode t;
LNode *next;
};
class STACKLINK{
public:
int count;
STACKLINK();
void Push(TreeNode n);
int Pop(TreeNode **p);
int IsEmpty();
void Clear();
private:
LNode *top,*p;
};
STACKLINK::STACKLINK(){
top=NULL;
count=0;
}
void STACKLINK::Push(TreeNode n){
count++;
p=new LNode ;
p->t=n;
p->next=top;
top=p;
//cout<<"入栈成功"<<n.x<<"."<<n.y<<endl;
}
int STACKLINK::Pop(TreeNode **p){
count--;
if(top==NULL){/*cout<<"栈空!"<<endl;*/ return 0;}
(*p)=&(top->t);
top=top->next;//cout<<"出栈";
return 1;
}
void STACKLINK::Clear(){
while(top!=NULL){
//cout<<top->x<<" ";
p=top;
top=top->next;
delete(p);
}
}
int STACKLINK::IsEmpty(){
if(top==NULL) return 1;
else return 0;
}
#endif // STACKLINK_H_INCLUDED