成长随心记19(二叉树的先中后遍历和层次遍历)

本文深入介绍了数据结构中的树概念,包括节点的度、树的度和性质。特别关注了二叉树的类型,如满二叉树、完全二叉树和二叉排序树的特点,并详细阐述了二叉树的先根、中根和后根遍历以及层次遍历的方法。此外,还提供了创建和遍历二叉树的C++代码示例。
摘要由CSDN通过智能技术生成

数据结构--树

1,基本术语
    1)度:节点有几个孩子叫做几度
    2)树的度:各节点中度的最大值
    3)有序树:各节点从左至右都是有次序的
2)树的性质
    1)节点数=总度数+1
    2)树的度(度为m的树)--各节点的度的最大值
         任意节点的度<=m,至少有一个节点度为m,一定是非空树,至少有m+1个节点
    3)m叉树--每个节点最多只能有m个孩子的树
        任意节点的度<=m,最多m个孩子,允许所有节点的度都<m,可以是空树
    4)度为m的树第i层至多有m的i-1个节点

3)二叉树
    1)满二叉树特点:
        只有最后一层有叶子节点
        不存在度为1的点
        按层序编号,节点i的左孩子为2i,右孩子为2i+1,节点为i的父节点为i/2
    2)完全二叉树特点:
        只有最后两层可能有叶子
        最多只有一个度为1的点
         按层序编号,节点i的左孩子为2i,右孩子为2i+1,节点为i的父节点为i/2
        i<=n/2为分支节点,i>n/2为叶子节点
    3)二叉排序树特点:
        左子树上所有节点的关键字都小于根节点的关键字
        左子树和右子树又各是一颗二叉排序树
    4)平衡二叉树:
        左子树和右子树的深度相差小于1

4)二叉树的先中后遍历和层次遍历

#include <queue>

typedef struct tree {//树节点
    struct tree* lchild;//指向左孩子的指针
    struct tree* rchild;//指向右孩子的指针
    int data;//数据域
}tree,*bitree;//tree表示这是一个节点,bitree表示这是一颗树

tree* create() {//创建一颗树
    bitree T;
    int val;
    cin >> val;
    if (val == -1)//如果等于-1,返回上一节点,停止往下递归
        return NULL;
    else {
        T = new tree;//T指向根节点
        T->data = val;//给根节点赋值val
        cout << "请输入左孩子:";
        T->lchild = create();//向左递归,创建左子树
        cout << "请输入右孩子:";
        T->rchild = create();//向右递归,创建右子树
    }
    return T;
}

void showleft(bitree T) {//左根遍历-根左右
    if (T == NULL)//递归遇到null,返回上一节点
        return;
    cout << T->data << ' ';
    showleft(T->lchild);//遍历左孩子
    showleft(T->rchild);//遍历右孩子
}

void showmid(bitree T) {//中根遍历-左根右
    if (T == NULL)//递归遇到null,返回上一节点
        return;
    showmid(T->lchild);//遍历左孩子
    cout << T->data << ' ';
    showmid(T->rchild);//遍历右孩子
}

void showright(bitree T) {//右根遍历-左右根
    if (T == NULL)//递归遇到null,返回上一节点
        return;
    showright(T->lchild);//遍历左孩子
    showright(T->rchild);//遍历右孩子
    cout << T->data << ' ';
}

void leveshow(bitree T) {//层序遍历
    queue<bitree>q;
    bitree tmp;
    q.push(T);//将根节点入队
    while (!q.empty()) {//如果队列为空跳出循环
        tmp = q.front();//用tmp保留出队的节点
        q.pop();
        cout << tmp->data;//打印根节点
        if (tmp->lchild != NULL)//如果左孩子不为空,则入队
            q.push(tmp->lchild);
        if (tmp->rchild == NULL)//如果右孩子不为空,则入队
            q.push(tmp->rchild);
    }
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

噌105

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值