零、二叉树解决的问题
通过学习数组和链表,前者可以在常数时间内找到目标对象,但是插入和删除操作,都需要耗费线性的时间。后者则可以在常数时间内进行插入和删除,但是查找某一元素,则需要线性时间。很显然各有利弊,所以我们能不能选用一种更好的结构呢?树结构则是很好的选择。
在这里我们以二叉树为例,虽为特例,但是我们都可以将任何有序的多叉树转换为二叉树。
一、BinNode类的声明与实现
二叉树的结点包含数据域、左孩子指针、右孩子指针、双亲指针。
#define BinNodePosi(T) BinNode<T>*
template<typename T> struct BinNode {
T data;
BinNodePosi(T) lChild;
BinNodePosi(T) rChild;
BinNodePosi(T) parent;
//构造函数
BinNode():parent(NULL),lChild(NULL),rChild(NULL){}
BinNode(T e,BinNodePosi(T) p=NULL,BinNodePosi(T) lc=NULL,BinNodePosi(T) rc=NULL):data(e),parent(p),lChild(lc),rChild(rc){}
//开放接口
BinNodePosi(T) insertAsLC(T const & e);
BinNodePosi(T) insertAsRC(T const & e);
bool IsRoot(BinNodePosi(T) p) {
return !(p->parent);}
bool IsLChild(BinNodePosi(T) p) {
return !IsRoot(p)&&(p==p->parent->lChild);}
bool IsRChild(BinNodePosi(T) p) { return !IsRoot(p)&&(p