内容:
二叉树初始化(先序输入)
层序遍历(非递归的队列方式)
先序遍历(递归)
中序遍历(递归)
后序遍历(递归)
代码:
#include<iostream>
#include<stdlib.h>
#include<stdio.h>
#include<vector>
#define nodedata char
using namespace std;
typedef struct treenode
{
nodedata data;
treenode* lchild;
treenode* rchild;
//treenode* parent;
}treenode, *tree;
#define quedata treenode*
typedef struct quenode
{
quedata data;
quenode* next;
}quenode;
typedef struct queque
{
quenode* head;
quenode* tail;
}queue;
void _init(queue &Q)
{
//Q.head = NULL;
Q.head = (quenode*)malloc(sizeof(quenode));
Q.tail = Q.head;
}
bool _empty(queue Q)
{
if (Q.head == Q.tail)return true;
else
return false;
}
quedata firstnode(queue Q)
{
if(!_empty(Q))
return Q.head->next->data;
}
void qpush(queue &Q, quedata e)
{
quenode* s;
s = (quenode*)malloc(sizeof(quenode));
s->data = e;
s->next = NULL;
Q.tail->next = s;
Q.tail = s;
}
quedata qpop(queue &Q)
{
if (Q.head == Q.tail)return false;
quenode* s;
s = (quenode*)malloc(sizeof(quenode));
s = Q.head->next;
quedata e = s->data;
Q.head->next=s->next;
if (Q.tail == s)Q.tail = Q.head;
free(s);
return e;
}
void initroot(tree &root)
{
root = NULL;
}
void initchild(tree &root)//前序输入初始化
{
nodedata data1;
cin >> data1;
if (data1 == '#')root = NULL;
else{
root = (treenode*)malloc(sizeof(treenode));
root->data = data1;
initchild(root->lchild);
initchild(root->rchild);
}
}
void visitallpre(tree tree1)//前序
{
if (tree1 != NULL)
{
cout << tree1->data ;
visitallpre(tree1->lchild);
//cout << "\t\t\t";
visitallpre(tree1->rchild);
}
}
void visitallmid(tree tree1)//中
{
if (tree1 != NULL)
{
visitallmid(tree1->lchild);
//cout << "\t\t\t";
cout << tree1->data;
visitallmid(tree1->rchild);
}
}
void visitallaft(tree tree1)//后序
{
if (tree1 != NULL)
{
visitallaft(tree1->lchild);
//cout << "\t\t\t";
visitallaft(tree1->rchild);
cout << tree1->data;
}
}
void visitallfloor(tree tree1)//层次
{
queue Q;
_init(Q);
if (tree1!=NULL)
{
qpush(Q, tree1);
}
while (!_empty(Q))
{
cout << firstnode(Q)->data;
if (firstnode(Q)->lchild!=NULL)
{
qpush(Q, firstnode(Q)->lchild);
}
if (firstnode(Q)->rchild != NULL)
{
qpush(Q, firstnode(Q)->rchild);
}
qpop(Q);
}
}
int main()
{
tree testtree;
initroot(testtree);
cout << "测试树前序序列为:ABD##E##CF###(#代表空)" << endl;
cout << "前序输入初始化" << endl;
initchild(testtree);
cout <<"\n";
cout << "前序遍历:" << endl;
visitallpre(testtree);
cout << "\n";
cout << "中序遍历:" << endl;
visitallmid(testtree);
cout << "\n";
cout << "后序遍历:" << endl;
visitallaft(testtree);
cout << "\n";
cout << "层次遍历:" << endl;
visitallfloor(testtree);
cout << "\n";
}
程序截图