首页 > 其他 > 详细

二叉树

时间:2020-04-02 17:01:02      阅读:56      评论:0      收藏:0      [点我收藏+]

树的基本概念

一对多,树状关系。

有且就有一个根节点,其他的节点为互不相交的有限集合,树的定义是递归的定义。

一个节点的子树的个数为该节点的度数,一棵树的度数是指该树中节点的最大度数。

技术分享图片

二叉树

二叉树与树的不同点

技术分享图片

二叉树的性质

技术分享图片

满二叉树与完全二叉树

技术分享图片

二叉树的顺序存储结构

技术分享图片

二叉树的链式存储结构

技术分享图片

typedef char datatype_bt;
typedef struct btreenode{
    datatype_bt data;
    struct btreenode *lchild,*rchild;
}btree_node,*btree_pnode;

#if 0 //递归实现方式
btree_pnode create_btree(void)
{
    datatype_bt ch;
    btree_pnode new;
    scanf("%c",&ch);
    if(‘#‘ == ch)
    {
        return NULL;
    }
    else{
        // 创建根节点
        new = (btree_pnode)malloc(sizeof(btree_node));
        if(NULL == new)
        {
            perror("malloc");
            exit(1);
        }
        new->data = ch;
        // 用相同的方法创建左子树
        new->lchild = create_btree();
        // 用相同的方法创建右子树
        new->rchild = create_btree();
    }
}
else
void create_btree(btree_pnode *T)
{
    datatype_bt ch;
    scanf("%c",&ch);
    if(‘#‘ == ch){
        *T = NULL;
    }
    else{
        //创建根节点
        *T = (btree_pnode)malloc(sizeof(btree_node));
        if(NULL = *T){
            perror("malloc");
            exit(1);
        }
        (*T)->data = ch;
        create_btree(&(*T)->lchild);
        create_btree(&(*T)->rchild);
    }
}

二叉树的遍历

由于二叉树的递归性质,遍历算法也是递归的,三种基本遍历算法:

  • 先上后下的按层次遍历
  • 先左(子树)后右(子树)的遍历
  • 先左(子树)后右(子树)的遍历

二叉树的先序递归遍历

按正常情况,每个节点都会经过3次,但我们只需要遍历访问一次,这便造成不同的结果:

  • 先序序列:第一次经过的时候就去访问它;
  • 中序序列:第二次经过的时候去访问它;
  • 后序序列:第三次经过的时候去访问它:
    技术分享图片
// 先序遍历
void pre_order(btree_pnode t)
{
    if(t != NULL){
        // 访问根节点
        printf("%c",t->data);
        // 先序遍历左子树
        pre_order(t->lchild);
        // 先序遍历右子树
        pre_order(t->rchild);
    }
}

二叉树的层次遍历

链式队列实现层次遍历
技术分享图片

void level_order(btree_pnode t)
{
    linkqueue_pnode q;
    init_linkqueue(&q);
    while(t != NULL){
        printf("%c",t->data);
        if(t->lchild != NULL)
            in_linkqueue(t->lchild,q);
        if(t->rchild != NULL)
            in_linkqueue(t->rchild,q);
        if(!is_empty_linkqueue(q))
            out_linkqueue(q,&t);
        else
            break;
    }
}

二叉树

原文:https://www.cnblogs.com/RSheng16/p/12620685.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!