二叉树的递归建立和遍历十分简单好写,为了加深对二叉树的理解这篇文章用c++实现了二叉树的建立,遍历,以及寻找根节点和别的节点之间的路径等功能,为了实现这些功能还写了必要的栈和队列的实现。
1. 二叉树节点:
typedef struct Btnode { // 二叉树单个节点
char data; //可以重复
struct Btnode *rchild; //右孩子(子树)
struct Btnode *lchild; //左孩子(子树)
struct Btnode *Pre; //打印路径时的前驱节点,其他地方无用
Btnode(): rchild(NULL), lchild(NULL), Pre(NULL) {} //无参构造函数
} Btnode, *Pbit;
2. 二叉树数据结构:输入方式输入一个字符串如“ABD###CE##F##”其中‘#’代表空节点,其余按照先序或者层次建立
class Binary_Tree { //二叉树数据结构
public:
friend class Stack;
friend class Queue;
void Precreate(); //建立二叉树(非递归先序)
void Levelcreate();//建立二叉树(非递归层次)
Binary_Tree(); //构造函数
~Binary_Tree(); //析构函数
void Clear(); //清空二叉树
Btnode *Root(); //返回根节点(root为私有, 通过该函数访问)
void Preorder(); //前序遍历(非递归)
void Inorder(); //中序遍历(非递归)
void Postorder(); //后序遍历(非递归)
void Levelorder(); //层次遍历
void Path(Btnode *);//打印给定节点到根节点的路径
void Print_Path(Pbit*, int); //打印缓冲区buff中所有节点到根节点路径
Pbit* Find(char m, int&); //寻找data为该参数的所有节点,并将其
//依次存入缓冲区buff中
private:
Btnode *root; //根节点
};//ABD###CE##F##
3. 栈的实现: 因为在二叉树非递归建树(先序)和先序中序后序遍历时必须利用栈,而作为数据结构的学习,用stl模板库倒不如自己实现,所以本文附上栈和队列的实现,这里栈利用顺序存储实现。
typedef Pbit Stype;
class Stack { //栈 顺序存储实现(数组)
public:
friend class Binary_Tree;
Stack();
~Stack();
void Clear(); //清空
void Push(Stype); //压栈
Stype Pop(); //出栈
Stype Top(); // 返回栈顶元素
bool Empty(); //判断栈是否为空
int Size(); // 长度
private:
Stype *s;
int top; //栈顶
int Maxsize; //动态分配最大长度
};
Stack:: Stack()
{
top = 0;
Maxsize = Addsize;
s = new Stype[Addsize];
}
Stack:: ~Stack()
{
Clear();
}
void Stack:: Clear()
{
delete []s;
}
void Stack:: Push(Stype Data)//入栈
{
if(top >= Maxsize)//栈空间不够的话补空间
{
realloc(s, (Maxsize + Addsize) * sizeof(Stype));
}
s[top++] = Data;
}
Stype Stack:: Pop()//出栈
{
if(Empty())
{
printf("栈为空\n");
return NULL;
}
return s[--top];
}
Stype Stack:: Top()//返回栈顶元素
{
return s[top - 1];
}
bool Stack:: Empty()//检查栈是否为空
{
if(top == 0) return true;
return false;
}
int Stack:: Size()//返回栈的长度
{
return top;
}
4. 队列的实现:在求路径,查找,层次遍历时需用到队列,在这里用双向链表实现队列。
typedef Pbit Qtype;
class Queue { //队列,双向链表(链式存储实现)
public:
friend class Binary_Tree;
Queue();
~Queue();
void Clear();
void Push(Qtype);
Qtype Pop();
Qtype Top();
bool Empty();
int Size();
private:
Qnode *Front; //队首指针
Qnod