#include<iostream>
using namespace std;
typedef char TElemType;
#define maxSize 20
typedef struct node {
TElemType data;
struct node*lchild, *rchild;
}BinNode,*BinTree;
typedef BinNode* SElemType;
void CreateTree(BinNode*&BT, TElemType ch[], int&n)
{
TElemType c = ch[n++];
if (c == ';')return;
if (c == '#') {
BT = NULL;
return;
}
else {
BT = new BinNode;
BT->data = c;
CreateTree(BT->lchild, ch, n);
CreateTree(BT->rchild, ch, n);
}
}
void PrintTree(BinNode*BT)
{
if (BT != NULL)
{
cout << BT->data << ' ';
PrintTree(BT->lchild);
PrintTree(BT->rchild);
}
}
//利用栈实现先序遍历的非递归算法
void PreOrder(BinTree BT)
{
SElemType S[maxSize];
int top = -1;
BinNode*p = BT;
do {
while (p != NULL)
{
cout << p->data << " ";
S[++top] = p;
p = p->lchild;
}
if (top != -1)
{
p = S[top--];
p = p->rchild;
}
} while (top != -1 || p != NULL);
}
//栈中序遍历的非递归算法
void InOrder(BinTree BT)
{
SElemType S[maxSize];
int top = -1;
BinNode*p = BT;
do {
while (p != NULL)
{
S[++top] = p;
p = p->lchild;
}
p = S[top--];
if (p != NULL)
{
cout << p->data << ' ';
p = p->rchild;
}
} while (top != -1 || p != NULL);
}
//二叉树后序遍历的非递归算法
void PostOrder(BinTree BT)
{
SElemType S[maxSize];
int top = -1;
BinNode*p = BT,*pre=NULL;
do {
while (p != NULL)
{
S[++top] = p;
p = p->lchild;
}
p = S[top];
if (p->rchild != NULL && p->rchild != pre)
p = p->rchild;
else {
cout << p->data;
pre = p;p = NULL;
top--;
}
}
}
void CreateBinTree_pre_In(BinNode*&t, TElemType pre[], TElemType In[], int s1, int t1, int s2, int t2)
{
if (s1 <= t1)
{
t = new BinNode;
t->data = pre[s1];t->lchild = NULL;t->rchild = NULL;
int i;
for (i = s2;i <= t2;i++)
{
if (pre[s1] == In[i])break;
}
CreateBinTree_pre_In(t->lchild, pre, In, s1 + 1, s1 - s2 + i, s2, i - 1);
CreateBinTree_pre_In(t->rchild, pre, In, s1 - s2 + i + 1, t1, i + 1, t2);
}
}
int main()
{
BinTree BT;
BinTree Tree;
int n = 0;
TElemType ch[] = "ABC##D#E###";
TElemType pre[] = "ABHFDECKG";
TElemType In[] = "HBDFAEKCG";
CreateBinTree_pre_In(Tree, pre, In, 0, 9, 0, 9);
CreateTree(BT, ch,n);
PreOrder(BT);
cout << endl;
InOrder(BT);
cout << endl;
PreOrder(Tree);
system("pause");
}
C++非递归创建访问二叉树
最新推荐文章于 2025-05-16 00:26:46 发布