二叉树的链式存储与实现(C++)

来源:互联网 发布:加拿大28百分百中算法 编辑:程序博客网 时间:2024/05/18 12:30

二叉链表存储结构的类型定义如下:

typedef struct Node{DataType data;struct Node *lchild;struct Node *rchild;}*BiTree,BitNode;

二叉树的基本运算:

(1)二叉树的初始化操作。

二叉树的初始化需要将指向二叉树的根结点指针置为空。

void InitBitTree(BiTree *T){*T=NULL;}

(2)二叉树的销毁操作。

void DestroyBitTree(BiTree *T){if (*T){if ((*T)->lchild){DestroyBitTree(&((*T)->lchild));}if ((*T)->rchild){DestroyBitTree(&((*T)->rchild));}free(*T);*T=NULL;}}
(3)创建二叉树操作。

根据二叉树的递归定义,先生成二叉树的根结点,将元素值赋值给结点的数据域,然后递归创建左子树和右子树。


void CreateBitTree(BiTree *T){DataType ch;scanf("%c",&ch);if (ch=='#'){*T=NULL;} else{*T=(BiTree)malloc(sizeof(BitNode));//生成根结点if (!(*T)){exit(-1);}(*T)->data=ch;CreateBitTree(&((*T)->lchild));//构造左子树CreateBitTree(&((*T)->rchild));//构造右子树}}
(4)二叉树的左插入操作。

指针p指向二叉树T的某个结点,将子树c插入到T中,使c成为p指向结点的左子树,p指向结点的原来左子树成为右子树。

int InsertLeftChild(BiTree p,BiTree c){if (p){c->rchild=p->lchild;p->lchild=c;return 1;}return 0;}

(5)二叉树的右插入操作。

指针p指向二叉树T的某个结点,将子树c插入到T中,使c成为p指向结点的右子树,p指向结点的原来右子树成为右子树。

int InsertRightChild(BiTree p,BiTree c){if (p){c->rchild=p->rchild;p->rchild=c;return 1;}return 0;}

(6)返回二叉树结点的指针操作。

在二叉树中查找指向元素值为e的结点,如果找到该结点,则返回该结点的指针,否则,返回NULL。

BiTree Point(BiTree T,DataType e){BiTree Q[MaxSize];//定义一个队列,用于存放二叉树中结点的指针int front=0,rear=0;//初始化队列BitNode *p;if (T){Q[rear]=T;rear++;while(front==rear)//如果队列非空{p=Q[front++];//取出队头指针,并出队if (p->data==e){return p;}if (p->lchild)//如果左孩子结点存在,将左孩子结点入队{Q[rear++]=p->lchild;}if (p->rchild)//如果右孩子结点存在,将右孩子结点入队{Q[rear++]=p->rchild;}}}return NULL;}

(7)返回二叉树结点的左孩子元素值操作。

如果元素值为e的结点存在,并且该结点的左孩子结点存在,则将该结点的左孩子结点的元素值返回。

DataType LeftChild(BiTree T,DataType e){BiTree p;if (T){p=Point(T,e);if (p&&p->lchild){return p->lchild->data;}}return;}

(8)返回二叉树结点的右孩子元素值操作。
如果元素值为e的结点存在,并且该结点的右孩子结点存在,则将该结点的右孩子结点的元素值返回。

DataType RightChild(BiTree T,DataType e){BiTree p;if (T){p=Point(T,e);if (p&&p->rchild){return p->rchild->data;}}return;}

(9)二叉树的左删除操作。

在二叉树中,指针p指向二叉树的某个结点,将p所指向的结点的左子树删除。

int DeleteLeftChild(BiTree p){if (p){DestroyBitTree(&(p->lchild));return 1;}return 0;}

(10)二叉树的右删除操作。

在二叉树中,指针p指向二叉树的某个结点,将p所指向的结点的右子树删除。

int DeleteRightChild(BiTree p){if (p){DestroyBitTree(&(p->rchild));return 1;}return 0;}


0 0
原创粉丝点击