第五章 树和二叉树
数据结构基础代码 (严蔚敏 人邮教育出版社)
二叉树的创建和深度优先递归遍历(前中后)
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
using namespace std;
#define MaxSize 100
//二叉树的链式存储结构
typedef struct BiTNode
{
int data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
int CreateBiTree(BiTree &T)
{
char ch;
cin >> ch;
if(ch=='#')
{
T=NULL;
}
else
{
T=new BiTNode;
T->data=ch;
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
return 0;
}
//先序遍历(根左右)
void PreorderTraversal(BiTree T)
{
if(T)
{
printf("%c",T->data);
PreorderTraversal(T->lchild);
PreorderTraversal(T->rchild);
}
}
//中序遍历(左根右)
void InorderTraversal(BiTree T)
{
if(T)
{
InorderTraversal(T->lchild);
printf("%c",T->data);
InorderTraversal(T->rchild);
}
}
//后序遍历(左右根)
void PostorderTraversal(BiTree T)
{
if(T)
{
PostorderTraversal(T->lchild);
PostorderTraversal(T->rchild);
//cout<<T->data;
printf("%c",T->data);
}
}
int main()
{
BiTree T;
cout<<"请输入先序遍历建立二叉树的节点"<<endl;
CreateBiTree(T);
printf("先序遍历打印二叉树\n");
PreorderTraversal(T);
cout<<endl;
printf("中序遍历打印二叉树\n");
InorderTraversal(T);
cout<<endl;
printf("后序遍历打印二叉树\n");
PostorderTraversal(T);
return 0;
}
运行结果如下:
二叉树深度优先的非递归遍历
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
using namespace std;
#define MaxSize 100
//二叉树的链式存储结构
typedef struct BiTNode
{
int data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
int CreateBiTree(BiTree &T)
{
char ch;
cin >> ch;
if(ch=='#')
{
T=NULL;
}
else
{
T=new BiTNode;
T->data=ch;
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
return 0;
}
//中序遍历(左根右)
void InorderTraversal(BiTree T)
{
if(T)
{
InorderTraversal(T->lchild);
printf("%c",T->data);
InorderTraversal(T->rchild);
}
}
//中序遍历的非递归算法
typedef struct
{
//char data[MaxSize];
BiTree data[MaxSize];//特别强调因为是指针进展,所以在建立栈的时候一定是建立指针类型的结构体数组
int top;
}SqStack;
void InitStack(SqStack &S)
{
S.top=-1;
}
int IsEmpty(SqStack S) //判断栈是否为空
{
if(S.top==-1)
{
return 1;
}
else
{
return 0;
}
}
void push(SqStack &S,BiTNode *p)
{
if(S.top==MaxSize-1)
{
printf(" the stack is full\n");
}
else
{
++(S.top);
//S.data[S.top]=p->data;
S.data[S.top]=p;
}
}
int POP(SqStack &S, BiTNode *&p)
{
if(S.top==-1)
{
printf("栈空!\n");
return 0;
}
else
{
//p->data=S.data[S.top];
p = S.data[S.top];
--(S.top);
}
return 1;
}
void InOrderTraversal(BiTree T)
{
SqStack S;
BiTNode *p,*q;
InitStack(S);
p=T;
q=new BiTNode;
while(p||!IsEmpty(S))
{
if(p)
{
push(S,p);
p=p->lchild;
}
else
{
POP(S,q);
printf("%c",q->data);
//cout<<q->data;
p=q->rchild;
}
}
}
int main()
{
BiTree T;
cout<<"请输入先序遍历建立二叉树的节点"<<endl;
CreateBiTree(T);
//printf("先序遍历打印二叉树\n");
//PreorderTraversal(T);
cout<<endl;
printf("中序遍历打印二叉树\n");
InorderTraversal(T);
cout<<endl;
// printf("后序遍历打印二叉树\n");
//PostorderTraversal(T);
//cout<<endl;
printf("中序非递归遍历打印二叉树\n");
InOrderTraversal(T);
return 0;
}
运行结果如下: