mirror of
https://github.com/This-weiyuqing/DSAndOS.git
synced 2026-10-18 03:03:58 +08:00
update
This commit is contained in:
1 parent
16d694ffe3
commit
35e5484d7c
183 files changed
+362
-7145
No files matched your search
@@ -0,0 +1,97 @@
|
||||
//算法5.2 中序遍历的非递归算法
|
||||
#include<iostream>
|
||||
using namespace std;
|
||||
|
||||
//二叉树的二叉链表存储表示
|
||||
typedef struct BiNode
|
||||
{
|
||||
char data; //结点数据域
|
||||
struct BiNode *lchild,*rchild; //左右孩子指针
|
||||
}BiTNode,*BiTree;
|
||||
|
||||
//链栈的定义
|
||||
typedef struct StackNode
|
||||
{
|
||||
BiTNode data;
|
||||
struct StackNode *next;
|
||||
}StackNode,*LinkStack;
|
||||
|
||||
//用算法5.3 先序遍历的顺序建立二叉链表
|
||||
void CreateBiTree(BiTree &T)
|
||||
{
|
||||
//按先序次序输入二叉树中结点的值(一个字符),创建二叉链表表示的二叉树T
|
||||
char ch;
|
||||
cin >> ch;
|
||||
if(ch=='#') T=NULL; //递归结束,建空树
|
||||
else{
|
||||
T=new BiTNode;
|
||||
T->data=ch; //生成根结点
|
||||
CreateBiTree(T->lchild); //递归创建左子树
|
||||
CreateBiTree(T->rchild); //递归创建右子树
|
||||
} //else
|
||||
} //CreateBiTree
|
||||
|
||||
void InitStack(LinkStack &S)
|
||||
{
|
||||
//构造一个空栈S,栈顶指针置空
|
||||
S=NULL;
|
||||
}
|
||||
|
||||
bool StackEmpty(LinkStack S)
|
||||
{
|
||||
if(!S)
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
void Push(LinkStack &S,BiTree e)
|
||||
{
|
||||
//在栈顶插入元素*e
|
||||
StackNode *p=new StackNode;
|
||||
p->data=*e;
|
||||
p->next=S;
|
||||
S=p;
|
||||
}
|
||||
|
||||
void Pop(LinkStack &S,BiTree e)
|
||||
{
|
||||
if(S!=NULL)//原书上写的是if(S==NULL)return ERROR;
|
||||
{
|
||||
*e=S->data;
|
||||
StackNode *p=S;
|
||||
S=S->next;
|
||||
delete p;
|
||||
}
|
||||
}
|
||||
|
||||
void InOrderTraverse1(BiTree T)
|
||||
{
|
||||
// 中序遍历二叉树T的非递归算法
|
||||
LinkStack S; BiTree p;
|
||||
BiTree q=new BiTNode;
|
||||
InitStack(S); p=T;
|
||||
while(p||!StackEmpty(S))
|
||||
{
|
||||
if(p)
|
||||
{
|
||||
Push(S,p); //p非空根指针进栈,遍历左子树
|
||||
p=p->lchild;
|
||||
}
|
||||
else
|
||||
{
|
||||
Pop(S,q); //p为空根指针退栈,访问根结点,遍历右子树
|
||||
cout<<q->data;
|
||||
p=q->rchild;
|
||||
}
|
||||
} // while
|
||||
} // InOrderTraverse
|
||||
|
||||
void main()
|
||||
{
|
||||
BiTree tree;
|
||||
cout<<"请输入建立二叉链表的序列:\n";
|
||||
CreateBiTree(tree);
|
||||
cout<<"中序遍历的结果为:\n";
|
||||
InOrderTraverse1(tree);
|
||||
cout<<endl;
|
||||
}
|
||||
Reference in new issue
Block a user