本篇介绍二叉树的伪指针表示法,及其先、中、后根遍历。
以下面这棵二叉树为例。
对应的伪指针存储结构为:
整体是一个顺序表,每个元素是一个结构体,包含本身元素,左孩子的下标,右孩子的下标。
也可以包含双亲结点的下标,此例没有包含。
参考代码如下:
#include "stdafx.h"
#include<iostream>
using namespace std;
template<typename T>class tree
{//基于伪指针的二叉树
struct node
{
T data;
int lchild;
int rchild;
};
node *elem;
int listsize;
int length;
public:
tree()
{//构造函数,一棵静态二叉树
listsize = 100;
elem = new node[listsize];
elem[1] = { 'a',2,3 };
elem[2] = { 'b',0,0 };
elem[3] = { 'c',4,5 };
elem[4] = { 'd',0,0 };
elem[5] = { 'e',0,0 };
length = 5;
}
void preTraverse(int root)
{//先根遍历
if (root!=0)
{
cout << elem[root].data<< " ";
preTraverse(elem[root].lchild);
preTraverse(elem[root].rchild);
}
}
void preTraverse()
{//先根遍历
preTraverse(1);
}
void InTraverse(int root)
{//中根遍历
if (root != 0)
{
InTraverse(elem[root].lchild);
cout << elem[root].data << " ";
InTraverse(elem[root].rchild);
}
}
void InTraverse()
{
InTraverse(1);
}
void postTraverse(int root)
{//后根遍历
if (root != 0)
{
postTraverse(elem[root].lchild);
postTraverse(elem[root].rchild);
cout << elem[root].data << " ";
}
}
void postTraverse()
{
postTraverse(1);
}
};
int main()
{
tree<char> t;
t.preTraverse();
cout << endl;
t.InTraverse();
cout << endl;
t.postTraverse();
cout << endl;
return 0;
}