A、三种遍历
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/ec63e01c522fb23762621dd78c8bdc9b.png)
(1)递归版
#include <iostream>
using namespace std;
typedef struct BiTNode
{
int data;
struct BiTNode* lchild, * rchild;
}BiTNode,*BiTree;
void preOrder(BiTree T,int &count)
{
if (T != NULL) {
count++;
cout << T->data<<" ";
preOrder(T->lchild,count);
preOrder(T->rchild,count);
}
}
void InOrder(BiTree T)
{
if (T != NULL) {
InOrder(T->lchild);
cout << T->data << " ";
InOrder(T->rchild);
}
}
void postOrder(BiTree T)
{
if (T != NULL) {
postOrder(T->lchild);
postOrder(T->rchild);
cout << T->data << " ";
}
}
int main()
{
BiTNode* root = new BiTNode();
BiTree ro = root;
ro->data = 1;
BiTNode* l = new BiTNode();
ro->lchild = l;
l->data = 2;
BiTNode* lr = new BiTNode();
l->rchild = lr;
lr->data = 4;
BiTNode* lrl = new BiTNode();
lr->lchild = lrl;
lrl->data = 6;
BiTNode* r = new BiTNode();
ro->rchild = r;
r->data = 3;
BiTNode* rr = new BiTNode();
r->rchild = rr;
rr->data = 5;
int count = 0;
preOrder(ro,count);
cout << endl;
InOrder(ro);
cout << endl;
postOrder(ro);
cout << endl;
cout << count;
return 0;
}
(2)非递归版(用栈实现)
#include <iostream>
#include <stack>
using namespace std;
typedef struct BiTNode
{
char data;
struct BiTNode* lchild, * rchild;
}BiTNode, * BiTree;
void preOrder2(BiTree T) {
stack<BiTNode*> s;
BiTree p = T;
while (p || !s.empty()) {
if (p) {
cout << p->data<<" ";
s.push(p);
p = p->lchild;
}
else {
p = s.top();
s.pop();
p = p->rchild;
}
}
}
void InOrder2(BiTree T)
{
stack<BiTNode*> s;
BiTree p = T;
while (p || !s.empty()) {
if (p) {
s.push(p);
p = p->lchild;
}
else {
p = s.top();
s.pop();
cout << p->data << " ";
p = p->rchild;
}
}
}
void postOrder2(BiTree T)
{
stack<BiTNode*> s;
BiTree p = T;
BiTree r = NULL;
while (p != NULL || !s.empty()) {
if (p) {
s.push(p);
p = p->lchild;
}
else {
p = s.top();
if (p->rchild && p->rchild != r) {
p = p->rchild;
}
else {
s.pop();
cout << p->data << " ";
r = p;
p = NULL;
}
}
}
}
int main()
{
BiTNode* root = new BiTNode();
BiTree ro = root;
ro->data = 'A';
BiTNode* l = new BiTNode();
ro->lchild = l;
l->data = 'B';
BiTNode* ll = new BiTNode();
l->lchild = ll;
ll->data = 'D';
BiTNode* lr = new BiTNode();
l->rchild = lr;
lr->data = 'E';
BiTNode* r = new BiTNode();
ro->rchild = r;
r->data = 'C';
preOrder2(ro);
cout << endl;
InOrder2(ro);
cout << endl;
postOrder2(ro);
cout << endl;
return 0;
}