题目:2-3树的建树(即插入)过程
问题描述:
实现2—3树的插入过程。
2—树是这样一种树:
A.每个非叶子结点都有2个或3个儿子;
B.每条众树根到树叶的路径长度相等;
C.只有一个根结点的树也是2—3树。
算法设计思想:(冒泡法等方法)
构建这样的结点:p指向父结点;lb指向左子树最大结点;mb指向第二个子树最大结点;ls指向最左孩子结点;ms指向中间孩子结点;rs指向最右孩子结点;ap附加孩子结点。
向2—3树T插入新的结点:
如果T只有一个叶子结点 标记为 ,则创建一个新的根结点 ,创建一个新的叶子结点 标记为 ,使 和 成为 的孩子,使 和 中较大的成为左孩子,另一个为中间孩子;
如果T有多于一个的结点,则令 ( 为 中所有孩子都是叶子结点的结点),创建一个新的叶子结点 标记为 ,如果 只有两个标记为 和 的孩子,那么令 ,调整 、 和 为正确的顺序;如果 有三个孩子,则令 ,再调用 合并 及其四个孩子到树T中,并调整合并后的树T根结点到 结点的路径上结点顺序。
源代码:
#include <iostream.h>
#define Create(v,x) v=new TreeNode;v->data=x;v->p=NULL;v->lb=NULL;v->mb=NULL;v->ls=NULL;v->ms=NULL;v->rs=NULL;v->ap=NULL;
//define后的字符列表只能在同一行
#define Delete(v) delete(v);
typedef struct TreeNode
{
int data; //数据项
struct TreeNode *p; //指向父结点的指针
struct TreeNode *lb; //指向左子树最大结点的指针
struct TreeNode *mb; //指向第二个子树最大结点的指针
struct TreeNode *ls; //指向最左孩子结点的指针
struct TreeNode *ms; //指向中间孩子结点的指针
struct TreeNode *rs; //指向最右孩子结点的指针
struct TreeNode *ap; //附加孩子结点
}TreeNode;
TreeNode* BuildTTT(int x)
{
TreeNode *t;
Create(t,x);
return t;
}
//查找函数,成功返回指向该结点的指针,否则返回NULL
TreeNode* Search(TreeNode *x,TreeNode *t)
//t为要查找的树的根结点,x为要查找的对象结点
{
if(t==NULL) return NULL; //查找失败
if(t->ls!=NULL&&t->ls->ls==NULL)//若孩子的下一层为空则说明孩子都是叶子结点
return
2-3树的建树(即插入)过程
最新推荐文章于 2022-08-06 15:40:23 发布