/*
名称:二叉树及其基本操作
说明:最近重新学习了二叉树,多了一个纬度,我去难度可不是上升一个层次。磨磨蹭蹭慢慢悠悠的把基本操作敲完了。在此记录一下。
*/
//二叉树的存储结构
typedef struct BiTNode
{
int data; //数据域
struct BiTNode *lchild,*rchild; //指针域
}BiTNode,*BiTree;
//初始化
void InitTree(BiTree &T,int x)
{
T->data = x;
T->lchild = NULL;
T->rchild = NULL;
}
//递归创建一棵二叉树
void CreateTree(BiTree &T)
{
int val = 0;
cin>>val;
if(val == -1) //如果是-1代表此分支终止
T = NULL;
else
{
T = new BiTNode;
T->data = val;
CreateTree(T->lchild);
CreateTree(T->rchild);
}
}
//先序遍历二叉树(递归)
void PreOrder(BiTree T)
{
if(T != NULL)
{
cout<<T->data<<" ";
PreOrder(T->lchild);
PreOrder(T->rchild);
}
}
//中序遍历二叉树(递归)
void InOrder(BiTree T)
{
if(T != NULL)
{
InOrder(T->lchild);
cout<<T->data<<" ";
InOrder(T->rchild);
}
}
//后序遍历二叉树(递归)
void PostOrder(BiTree T)
{
if(T!=NULL)
{
PostOrder(T->lchild);
PostOrder(T->rchild);
cout<<T->data<<" ";
}
}
//先序遍历二叉树(非递归)
void PreOrder2(BiTree T)
{
stack<BiTNode*> _sta;
BiTNode * p = T;
//_sta.push(p);
while( !_sta.empty() || p != NULL )
{
if(p != NULL)
{
_sta.push(p); //根元素入栈
cout<<p->data<<" ";
p = p->lchild; //指向左子树
}
else
{
p = _sta.top(); //栈顶元素出栈
_sta.pop();
p = p->rchild; //指向右子树
}
}
}
//中序遍历二叉树(非递归)
void InOrder2(BiTree T)
{
stack<BiTNode *> _sta;
BiTNode * p = T;
while(!_sta.empty() || p!=NULL)
{
if(p != NULL)
{
_sta.push(p); //根元素入栈
p = p->lchild; //转向其左子树
}
else
{
p = _sta.top();
cout<<p->data<<" ";
_sta.pop();
p = p->rchild;
}
}
}