中序遍历-为什么二叉树的中序非递归算法无法实现

问题描述

为什么二叉树的中序非递归算法无法实现

// 实验三.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include
using namespace std;
#define true 1
#define false 0
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define MAXSIZE 100
typedef char TElemType;
typedef int Status;
typedef struct BiTNode
{//二叉树的存储结构
TElemType data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
typedef BiTree SElemType;
typedef struct
{
SElemType *base; //栈底指针
SElemType *top; //栈顶指针
int stacksize; //栈可用的最大容量

}SqStack;
Status InitStack(SqStack &S)
{//构造一个空栈S
S.base=new SElemType[MAXSIZE];
if(!S.base ) exit(OVERFLOW);
S.top =S.base ;
S.stacksize=MAXSIZE;
return OK;
}
Status Push(SqStack &S,SElemType e)
{//
if (S.top-S.base==S.stacksize ) return ERROR;

    *S.top++=e;
return OK;

}
Status Pop(SqStack &S,SElemType e)
{//
if(S.top==S.base) return ERROR;
e=*--S.top;
return OK;
}
SElemType GetTop(SqStack S)
{//
if(S.top!=S.base )
return *(S.top-1);
}
Status StackEmpty(SqStack S)
{
if(S.top==S.base)
return OK;
else ERROR;
}
void CreatBiTree(BiTree &T)
{//先序遍历的顺序建立二叉链表
char ch;
cin>>ch;
if(ch=='#') T=NULL;
else
{
T=new BiTNode;
T->data=ch;
CreatBiTree(T->lchild);
CreatBiTree(T->rchild);
}

}
void PreOrderTraverse(BiTree T)
{//前序遍历递归算法
if(T)
{
cout<data;
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
}
}
Status InOrderTraverse(BiTree T)
{//中序遍历递归算法
if(T)
{
InOrderTraverse(T->lchild);
cout<data;
InOrderTraverse(T->rchild);
}
return OK;
}
void InOrderTraverse_non(BiTree &T)
{//中序遍历非递归算法
SqStack S;
InitStack(S);
BiTree p,q;
p=T;
q=new BiTNode;
while (p||!StackEmpty(S))
{
if(p)
{
Push(S,p);
p=p->lchild;
}
else
{
Pop(S,q);
cout<data;
p=q->rchild;
}
}
}
void PostOrderTraverse(BiTree T)
{//后序遍历递归算法
if(T)
{
PostOrderTraverse(T->lchild);
PostOrderTraverse(T->rchild);
cout<data;
}

}

int Depth(BiTree T)
{//计算二叉树的深度
int m,n;
if(T==NULL) return 0;
else
{
m=Depth(T->lchild );
n=Depth(T->rchild );
if(m>n) return (m+1);
else return (n+1);
}
}
int NodeCount(BiTree T)
{//统计二叉树中的结点个数
if(T==NULL) return 0;
else return NodeCount(T->lchild)+NodeCount(T->rchild)+1;
}
Status LeafCount(BiTree &T,int m)
{//统计二叉树的叶结点个数
if(T)
{
if(!T->lchild&&!T->rchild) m++;
else m=LeafCount(T->lchild,m)+LeafCount(T->rchild,m);
}
return m;
}
Status CountTNode_1(BiTree &T,int m)
{//统计二叉树中度为1的结点个数
if(T)
{
if(!T->lchild&&T->rchild) m++ ;
if(!T->rchild&&T->lchild) m++;
else m=CountTNode_1(T->lchild,m)+CountTNode_1(T->rchild,m);
}
return m;
}
Status Exchangechild(BiTree&T)
{//交换二叉树每个结点的左孩子和右孩子
BiTree t;
if(T)
{
t=T->lchild;
T->lchild=T->rchild;
T->rchild=t;
Exchangechild(T->lchild);
Exchangechild(T->rchild);
}
return OK;
}
//void Allpath(BiTree &T,LinkStack &S)
//{
//char e;
//if(T)
// {
// Push(S,T->data);
// if(!T->lchild &&!T->rchild ) printStack(S);
//else
//{
// Allpath(T->lchild ,S);
// Allpath(T->rchild ,S);
// }
// Pop(S,e);
//}
//}
int main()
{
int choose,d,n_leaf,n_1,n_node;
int m,m_1;
m=m_1=0;
BiTree T;
cout<<"1.先序遍历递归建立二叉链表"<
cout
cout
cout
cout
cout
cout
cout
cout
cout
cout
choose=-1;
while(choose!=0)
{
cout
cin>>choose;
switch(choose)
{case 1:
cout<<"建立二叉树,请输入元素"<<endl;
CreatBiTree(T);
break;
case 2:
cout<<"元素按照前序输出为"<<endl;
PreOrderTraverse( T);
cout<<endl;
break;
case 3:
cout<<"元素按照中序递归输出为"<<endl;
InOrderTraverse(T);
break;
case 4:
cout<<"元素按照中序非递归输出为"<<endl;
InOrderTraverse_non(T);
cout<<endl;
break;
case 5:
cout<<"元素按照后序递归输出为"<<endl;
PostOrderTraverse(T);
cout<<endl;
break;
case 6:
cout<<"二叉树的深度为"<<endl;
d=Depth( T);
cout<<d<<endl;
break;
case 7:
cout<<"二叉树中的结点个数为:"<<endl;
n_node=NodeCount( T);
cout<<n_node<<endl;
break;
case 8:
cout<<"二叉树中的叶子结点个数为:"<<endl;
n_leaf=LeafCount(T,m);
cout<<n_leaf;
break;
case 9:
cout<<"二叉树中度为一的结点个数为:"<<endl;
n_1=CountTNode_1(T,m_1);
cout<<n_1<<endl;
break;
case 10:
if(Exchangechild(T))
cout<<"左孩子右孩子交换成功"<<endl;
else cout<<"左孩子右孩子交换失败"<<endl;
break;
}
}
return 0;

}

这段代码中的中序遍历非递归算法无法实现,,为什么啊,,求大神解答

解决方案

http://www.docin.com/p-337312261.html
http://blog.csdn.net/fduan/article/details/7833653

时间: 2025-01-29 23:40:30

中序遍历-为什么二叉树的中序非递归算法无法实现的相关文章

c语言-大神求教C语言,知道二叉树先序中序遍历序列,求后序遍历序列。

问题描述 大神求教C语言,知道二叉树先序中序遍历序列,求后序遍历序列. #include#include#include using namespace std; typedef struct Btree{ struct Btree *left; struct Btree *right; char data;}Node; void Create_Btree(Node *tree char *pre int pre_low int pre_high char *middle int middle_

C++中前序遍历和中序遍历重建二叉树例子

已知某二叉树的前序遍历结果和中序遍历结果,假如前序遍历和中序遍历的结果中都不含重复的数字.例如某个二叉树的前序遍历的序列为{1,2,4,7,3,5,6,8}中序遍历序列{4,7,2,1,5,3,8,6}. 通过前序遍历和中序遍历重建二叉树  struct BinaryTreeNode{  int m_nValue;  BinaryTreeNode* m_pLeft;  BinaryTreeNode* m_pRight; } 先把三种遍历算法写上: // 前序遍历 void preOrder(Bi

二叉树系列(一):已知先序遍历序列和中序遍历序列,求后序遍历序列

  首先介绍一下三种遍历顺序的操作方法:   1.先序遍历   (1)访问根结点:   (2)先序遍历左子树:   (3)先序遍历右子树.   2.中序遍历   (1)中序遍历左子树:   (2)访问根结点:   (3)中序遍历右子树.   3.后序遍历   (1)后序遍历左子树:   (2)后序遍历右子树:   (3)访问根结点.   知道了二叉树的三种遍历规则,只要有中序遍历序列和前后任一种遍历序列,我们就可以求出第三种遍历序列,今天我们研究的是已知先序和中序遍历序列,求后序遍历序列.   

二叉树的应用-先序遍历中序遍历还原二叉树

二叉树的一些应用 还是大实验要求的 还有已知先序遍历 中序遍历求后续遍历 #include <iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; #define MAX 100 //节点个数 #define Null 0 typedef int Elemtype; class node { public: Elemtype data; no

UVa 548:Tree 二叉树的重建——中序遍历与后续遍历进行建树

题目链接: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=104&page=show_problem&problem=489 题目类型: 数据结构, 二叉树 题目大意: 给两个组数字,都是在同一棵二叉树上的,第一组是按中序遍历(inorder)顺序输出的,第二组是按后序遍历(postorder)输出的, 根据这两组数据构建出原来的二叉树,然后计算从根结点到每个叶子结

二叉树前序、中序、后序遍历相互求法

今天来总结下二叉树前序.中序.后序遍历相互求法,即如果知道两个的遍历,如何求第三种遍历方法,比较笨的方法是画出来二叉树,然后根据各种遍历不同的特性来求,也可以编程求出,下面我们分别说明. 首先,我们看看前序.中序.后序遍历的特性:  前序遍历:      1.访问根节点      2.前序遍历左子树      3.前序遍历右子树  中序遍历:      1.中序遍历左子树      2.访问根节点      3.中序遍历右子树  后序遍历:      1.后序遍历左子树      2.后序遍历右

c语言-已知二叉树的中序遍历序列与层次遍历序列分别存于数组A[1-n] B[1-n]中,建立二叉树的二叉链表。

问题描述 已知二叉树的中序遍历序列与层次遍历序列分别存于数组A[1-n] B[1-n]中,建立二叉树的二叉链表. 已知二叉树的中序遍历序列与层次遍历序列分别将值存于数组A[1-n].B[1-n]中,请编程建立二叉树的二叉链表. 二叉树结点定义 typedef struct { Elemtype data; BiNode* lchild,rchild; }BiNode,*BiTree; 解决方案 http://www.zybang.com/question/23e04267bb862ea67197

中序遍历二叉树-二叉树的非递归操作。。

问题描述 二叉树的非递归操作.. 如何用栈实现二叉树的非递归操作,越详细越好,谢谢各位啦.一定要详细哦 解决方案 void inOrder2(BinTree *root) //非递归中序遍历 { stack<BinTree*> s; BinTree *p=root; while(p!=NULL||!s.empty()) { while(p!=NULL) { s.push(p); p=p->lchild; } if(!s.empty()) { p=s.top(); cout<<

二叉树遍历算法之二:中序遍历

中序遍历的递归实现 中序遍历遍历指的是先访问二叉树中节点的左孩子,再访问当前节点,最后再访问其右孩子.具体访问步骤如下: 首先访问根节点,判断根节点是否有左孩子,如果有,进行第二步:如果没有,跳到第三步: 访问左孩子,继续判断当前节点是否有左孩子,如果有则继续访问其左孩子,直到某节点的左孩子为空 判断是否有右孩子,如果有,则继续判断当前节点是否有左孩子,一直到某节点没有左孩子为止 把第二步访问的节点做为当前节点(该节点无左孩子,如图中的15节点),按照规则,下一步应该访问其右孩子 返回到第四部节