树以及二叉树

文章详细介绍了树的基本概念,包括节点的度、叶节点、父节点等,并深入讲解了二叉树的定义、形态、性质以及满二叉树和完全二叉树的区别。此外,还探讨了二叉树的存储方式,如顺序存储和链式存储,并列举了二叉树的遍历方法,如先序、中序和后序遍历。最后,提到了二叉树的递归和非递归算法实现。
摘要由CSDN通过智能技术生成

一.树

以分支关系定义的层次结构

,n个节点的有限集合

一.树的基本定义

        1.孩子节点或子节点:一个节点含有的子树的根节点称为该节点的子节点;

        2.节点的度:一个节点含有的子节点的个数称为该节点的度;

        3.叶节点或终端节点:度为0的节点称为叶节点;

        4.非终端节点或分支节点:度不为0的节点;

        5.双亲节点或父节点:若一个节点含有子节点,则这个节点称为其子节点的父节点;

        6.兄弟节点:具有相同父节点的节点互称为兄弟节点;

        7.树的度:一棵树中,最大的节点的度称为树的度;

        8.节点的层次:从根开始定义起,根为第1层,根的子节点为第2层,以此类推;

        9.树的高度或深度:树中节点的最大层次;

        10.堂兄弟节点:双亲在同一层的节点互为堂兄弟

        11.节点的祖先:从根到该节点所经分支上的所有节点;

        12.子孙:以某节点为根的子树中任一节点都称为该节点的子孙

        13.森林:由M 棵互不相交的树的集合称为森林。

二.二叉树

1.定义:是n个有限元素的集合,该集合或者为空、或者由一个称为根(root)的元素及两个不相交的、被分别称为左子树和右子树的二叉树组成,是有序树。当集合为空时,称该二叉树为空二叉树。在二叉树中,一个元素也称作一个节点

2.基本形态

        1>空二叉树

        2>只有根节点的二叉树

        3>右子树为空

        4>左子树为空

        5>左右

3.特点

        1>在二叉树中有左右孩子之说,并且次序不能颠倒,在树中没有

        2>每个节点最多有两颗子树

4.性质

        性质1.在二叉树的第i层上至多有2**(i-1)

        性质2.在深度为k的二叉树上至多有2**k-1个结点

        性质3.对任何一颗二叉树T,n0 = n2 + 1;

5.特殊形式的 二叉树

        1>满二叉树:一颗深度为k且有2**k-1个结点。如下图所示 

        2>完全二叉树:编号与满二叉树的编号一一对应,就叫完全二叉树(怎么编号:从上到下、从左到右),如下图所示

 

###注意叶子节点数

        性质4:具有N个结点的完全二叉树的深度为log2N

        性质5:

        

三.二叉树的存储结构

1.顺序存储结构

以数组为例,

###当什么时候补的结点数最多

2.链式存储

3.树与二叉树的转化

1>

4.森林转化为二叉树

四.二叉树的遍历

1.先序遍历

结果:A B D C

2.中序遍历

 结果:B D A  C  

先左结点,在根结点

3.后序遍历

 结果:D B C A 

五.二叉树的算法

1.递归算法

void preorder(JD *bt)
{
    if(bt != NULL)
    {
        printf("%d\t",bt -> data);
        preorder(bt -> lchild);
        preorder(bt -> rchild);
    }
}

2.非递归算法

1>先序遍历

void preordxer(Btree *b)
{
    BTree *stack[MaxSize], *p;
    int top = -1;
    cout<<"先序遍历";
    p = b;

    while(p != null || top != -1)   //第一层循环:
    {
        while(p != null)  //第二层循环:判断结点是否有子树,即是否为空,
        {    
            cout<<p -> data;
            top++;
            stack[top] = p;
            p = p->lchild;
        }

        if(top != -1)    //开始第二次出栈
        {
            p = stack[top];
            top--;
            p = p->rchild;
        }
    }
    cout<<endl;
}

2>中序遍历

void preordxer(Btree *b)
{
    BTree *stack[MaxSize], *p;
    int top = -1;
    cout<<"先序遍历";
    p = b;

    while(p != null || top != -1)   //第一层循环:
    {
        while(p != null)  //第二层循环:判断结点是否有子树,即是否为空,开始入栈
        {    
            cout<<p -> data;
            top++;
            stack[top] = p;
            p = p->lchild;
        }

        if(top != -1)    //开始第二次出栈
        {
            p = stack[top];
            top--;
            p = p->rchild;
        }
    }
    cout<<endl;
}

未完+修改。。。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值