6.2 基本操作与存储—二叉树的基本操作及实现

1.二叉树的基本操作

二叉树的基本操作通常有以下几种:

(1)Initiate(bt)建立一棵空二叉树。

(2)Create(x,lbt,rbt)生成一棵以x 为根结点的数据域信息,以二叉树lbt 和rbt为左子树和右子树的二叉树。

(3)InsertL(bt,x,parent)将数据域信息为x 的结点插入到二叉树bt 中作为结点parent 的左孩子结点。如果结点parent 原来有左孩子结点,则将结点parent 原来的左孩子结点作为结点x 的左孩子结点。

(4)InsertR(bt,x,parent)将数据域信息为x 的结点插入到二叉树bt 中作为结点parent 的右孩子结点。如果结点parent 原来有右孩子结点,则将结点parent 原来的右孩子结点作为结点x 的右孩子结点。

(5)DeleteL(bt,parent)在二叉树bt 中删除结点parent 的左子树。

(6)DeleteR(bt,parent)在二叉树bt 中删除结点parent 的右子树。

(7)Search(bt,x)在二叉树bt 中查找数据元素x。

(8)Traverse(bt)按某种方式遍历二叉树bt 的全部结点。

2.算法的实现

算法的实现依赖于具体的存储结构,当二叉树采用不同的存储结构时,上述各种操作的实现算法是不同的。下面讨论基于二叉链表存储结构的上述操作的实现算法。

(1)Initiate(bt)初始建立二叉树bt,并使bt 指向头结点。在二叉树根结点前建立头结点,就如同在单链表前建立的头结点,可以方便后边的一些操作实现。

int Initiate (BiTree *bt)

{/*初始化建立二叉树*bt 的头结点*/

if((*bt=(BiTNode *)malloc(sizeof(BiTNode)))==NULL)

return 0;

*bt->lchild=NULL;

*bt->rchild=NULL;

return 1;

}

算法6.1

(2)Create(x,lbt,rbt)建立一棵以x 为根结点的数据域信息,以二叉树lbt 和rbt为左右子树的二叉树。建立成功时返回所建二叉树结点的指针;建立失败时返回空指针。

BiTree Create(elemtype x,BiTree lbt,BiTree rbt)

{/*生成一棵以x 为根结点的数据域值以lbt 和rbt 为左右子树的二叉树*/

BiTree p;

if ((p=(BiTNode *)malloc(sizeof(BiTNode)))==NULL) return NULL;

p->data=x;

p->lchild=lbt;

p->rchild=rbt;

return p;

}

算法6.2

(3)InsertL(bt,x,parent)

BiTree InsertL(BiTree bt,elemtype x,BiTree parent)

{/*在二叉树bt 的结点parent 的左子树插入结点数据元素x*/

BiTree p;

if (parent==NULL)

{ printf(“\n 插入出错”);

return NULL;

}

if ((p=(BiTNode *)malloc(sizeof(BiTNode)))==NULL) return NULL;

p->data=x;

p->lchild=NULL;

p->rchild=NULL;

if (parent->lchild==NULL) parent->lchild=p;

else {p->lchild=parent->lchild;

parent->lchild=p;

}

return bt;

}

算法6.3

(4)InsertR(bt,x,parent)功能类同于(3),算法略。

(5)DeleteL(bt,parent)在二叉树bt 中删除结点parent 的左子树。当parent 或parent的左孩子结点为空时删除失败。删除成功时返回根结点指针;删除失败时返回空指针。

BiTree DeleteL(BiTree bt,BiTree parent)

{/*在二叉树bt 中删除结点parent 的左子树*/

BiTree p;

if (parent==NULL||parent->lchild==NULL)

{ printf(“\n 删除出错”);

return NULL’

}

p=parent->lchild;

parent->lchild=NULL;

free(p); /*当p 为非叶子结点时,这样删除仅释放了所删子树根结点的空间,*/

/*若要删除子树分支中的结点,需用后面介绍的遍历操作来实现。*/

return br;

}

算法6.4

(6)DeleteR(bt,parent)功能类同于(5),只是删除结点parent 的右子树。算法略。操作Search(bt,x)实际是遍历操作Traverse(bt)的特例,关于二叉树的遍历操作的实现,将在下一节中重点介绍。