二叉树

目录

二叉树的定义

二叉树的性质

二叉树的操作

二叉树的遍历


二叉树的定义

 一个二叉是一个有穷的结点集合。这个集合可以为空,若不为 ,则是根节点和称为左子树和右子树两个不相交的二叉树组成。

二叉树的性质

二叉树的深度不大于节点数N,平均深度是.

所有节点都有左右子树的二叉树被称为完美二叉树(满二叉树)。

一棵深度为k的有n个结点的二叉树,对树中的结点按从上至下、从左至右的顺序进行编号,如果编号为i的结点与满二叉树中的位置相同,则其称为完全二叉树。 完全二叉树的叶结点只能出现在最下层和次下层,且最下层叶结点集中在树的左边。

二叉树的操作

二叉树的遍历

  • 中序遍历

void InorderTraversal(BinTree BT)
{
    if(BT){
        InorderTraversal(BT->Left);
        /*此处假设对BT结点的访问就是打印数据*/
        printf("%d", BT->Data);
        InorderTraversal(BT->Right);
    }
}
  • 先序遍历

void InorderTraversal(BinTree BT)
{
    if(BT){
        printf("%d", BT->Data);
        InorderTraversal(BT->Left);        
        InorderTraversal(BT->Right);
    }
}
  • 后序遍历

void InorderTraversal(BinTree BT)
{
    if(BT){        
        InorderTraversal(BT->Left);        
        InorderTraversal(BT->Right);
        printf("%d", BT->Data);
    }
}
  • 非递归遍历

以二叉树的中序遍历为例,当遇到一个结点就把它压栈,并去遍历其左子树;当左子树遍历结束后,从栈顶弹出这个结点并访问它,然后按其右指针再去中序遍历该结点的右子树。

void InorderTraversal(BinTree BT)
{
    BinTree T;
    /*创建空堆栈S,元素类型为BinTree*/
    Stack S = CreateStack();
    /*从根结点出发*/
    T=BT;
    while(T || !IsEmpty(S)){
        while(T){
            Push(S, T);
            T = T->Left;
        }
        /*结点弹出堆栈*/
        T = Pop(S);
        Printf("%d", T->Data);
        /*转向右子树*/
        T = T->Right;
    }
}
  • 层序遍历

void LevellorderTraversal(BinTree BT)
{
    Queue Q;
    BinTree T;
    
    /*树为空直接返回*/
    if(!BT)
        return;

    Q = CreatQueue();
    AddQ(Q, BT);
    
    while(!IsEmpty(Q)){
        T = DeleteQ(Q);
        /*访问取出队列的结点*/
        printf("%d", T->Data);

        if(T->Left)
            AddQ(Q, T->Left);
        if(T->Right)
            AddQ(Q, T->Right);
    }
}

参考文献:《数据结构》第二版,陈越

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值