博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
二叉树
阅读量:7210 次
发布时间:2019-06-29

本文共 4257 字,大约阅读时间需要 14 分钟。

1,定义:对于任何结点x,其左子树中的关键字最大不超过x->key,其右子树的关键字最小不小于x->key。 如图所示:

 

            为了简单起见,这里设结点包括key和eft,right,和p,分别为关键字、左结点、右结点、父结点。

typedef struct node{    int key;    struct node *left,*right,*p;//左结点,右结点,父结点}NODE;

2,二叉树的初始化

//数组a为初始化数据,len为数组长度 NODE *init(int a[],int len){    if(len==0)        return NULL;     NODE *root;     root=(NODE *)malloc(sizeof(NODE));     root->key=a[0];     root->left=NULL;     root->right=NULL;     root->p=NULL;     for(int i=1;i
key=a[i];p->right=NULL; p->left=NULL; p->p=NULL; NODE* m=root; NODE* n=NULL; while(m!=NULL) { n=m; if(p->key>m->key) m=m->right; else m=m->left; } p->p=n; if(p->key>=n->key) n->right=p; else n->left=p; } return root;}

3,二叉树的遍历(中序遍历)

void printf_tree(NODE *root) //递归{    if(root)    {        printf_tree(root->left);        printf("%d  ",root->key);        printf_tree(root->right);    }} void printf_tree2(NODE *root)    //非递归中序遍历 {
    stack
s;     NODE *p=root;     while(p!=NULL||!s.empty())     {
        while(p!=NULL)         {
            s.push(p);             p=p->left;         }         if(!s.empty())         {
            p=s.top();             cout<
key<<" ";             s.pop();             p=p->right ;         }     }     } //分层遍历 void printf_tree3(NODE* root) {
    vector
vec;     vec.push_back(root);     int cur = 0;     int last = 1;     while(cur < vec.size()) {
        last = vec.size();         while(cur < last) {
            printf("%d ",vec[cur]->key);             if(vec[cur] -> left)                 vec.push_back(vec[cur]->left);             if(vec[cur] -> right)                 vec.push_back(vec[cur] -> right);             cur++;         }         printf("\n");     } }

 

4, 二叉树结点的后继

     a,当p的右结点不为空时:后继为p的右子树中的最小值

     b,当p的右结点为空: 为祖先中的最小值

            (a),p为父结点左结点:后继为父节点

            (b), p为父结点的右结点:

 

                             
                            
         a                                                                        a(a)                                                                a(b)
NODE *successor(NODE *p){    NODE *q;    if(p->right!=NULL)    //p的右结点不为空    {        q=p->right;        while(q->left)            q=q->left;        return q;    }   NODE *m=p;    q=m->p;    while(q&&(q==m->right))    {        m=q;        q=m->p;    }    return q;}

5,二叉树的插入

 

bool insert(NODE *root,int x){    NODE *p=(NODE *)malloc(sizeof(NODE));    p->key=x;p->right=NULL;    p->left=NULL;    p->p=NULL;    NODE* m=root;    NODE* n=NULL;    while(m!=NULL)    {        n=m;        if(p->key>m->key)            m=m->right;        else            m=m->left;            }    p->p=n;    if(p->key>n->key)        n->right=p;    else        n->left=p;    return true;}

6,查找最小值,或者最大值

NODE *search_min(NODE *root){    if(root==NULL)        return NULL;    NODE *p;    p=root;    while(p->left)        p=p->left;    return p;}NODE  *search_max(NODE *root){    if(root==NULL)        return NULL;    NODE *p;    p=root;    while(p->right)        p=p->right;    return p;}

7,删除

bool del(NODE *root,NODE *t){    if(NULL==t)        return false;    if(t->left==NULL&&t->right==NULL)    {        NODE *parent=t->p;        if(parent->left==t)            parent->left=NULL;        else            parent->right=NULL;        free(t);        return  true;    }    if (t->left==NULL)  //有右子树    {    /*    NODE *parent=t->p;        if(parent->left==t)            parent->left=t->right;        else            parent->right=t->right;        t->right->p=parent;        free(t);        return true;*/        NODE *p=search_min(t->right);        t->key=p->key;        if(del(root,p))              return true;        else            return false;    }        if (t->right==NULL)  //有左子树    {    /*    NODE *parent=t->p;        if(parent->left==t)            parent->left=t->left;        else            parent->right=t->left;        t->left->p=parent;        free(t);        return true;*/        NODE *p=search_max(t->left);        t->key=p->key;        if(del(root,p))            return true;        else            return false;            }    //有左右子树    NODE *m=successor(t);//m为t的后继结点            t->key=m->key;    if(del(root,m))        return true;    return false;}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

转载于:https://www.cnblogs.com/sklww/p/3379482.html

你可能感兴趣的文章
营收放缓、股价暴跌、高管离职,Facebook迎来至暗时刻?
查看>>
MySQL探秘(二):SQL语句执行过程详解
查看>>
使用Akka持久化——消息发送与接收
查看>>
Spring框架之Filter应用
查看>>
在IDEA中设置自己的名字和时间
查看>>
@NotBlank注解地正确使用
查看>>
Android--音乐播放器
查看>>
互联网巨头布阵LoRaWAN,是又一春天还是不容乐观?
查看>>
CSS 全解析实战(一)-导读
查看>>
【深度学习再突破】让计算机一眼认出“猫”:哈佛提出新高维数据分析法
查看>>
C++程序设计基础(7)位运算
查看>>
MSDN-9月杂志推荐
查看>>
【原理】解析一致性哈希算法
查看>>
用爬虫分析互联网大数据行业薪资情况
查看>>
【解放日报】除了CEO首席执行官,你了解CIO吗?
查看>>
git 安装 on centos7
查看>>
Node.js入门以及第一个helloworld程序.
查看>>
6月20日云栖精选夜读丨国内首家!阿里云宣布全面提供IPv6服务
查看>>
改造房车走天下,这个阿里妹子不一般
查看>>
沃尔玛正测试货架扫描机器人,并称不会取代人类员工
查看>>