数据结构(C++)树和二叉树

在树中将数据元素称为结点

某结点所拥有的子树的个数成为该结点的度

树中各结点度的最大值称为该树的度

度为0的结点称为叶子结点,也称为终端结点,度不为0的结点称为分支结点,也称为非终端结点

某结点的子树的根结点称为该结点的孩子结点,反之,该结点称为其孩子结点的双亲结点

具有同一个双亲的孩子结点互称为兄弟结点

如果从结点x到结点y有一条路径,那么x就称为y的祖先,y称为x的子孙

规定根结点的层数为1,对其余任何结点,若某结点在第k层,则其孩子结点在第k+1层。

树中所有结点的最大层数称为书的深度,也称为树的高度

树中每一层结点个数的最大值称为树的宽度

二叉树:是n个结点的有限集合,该集合为空集(空二叉树),或者由一个根结点和两棵互不相交的、分别称为根结点的左子树和右子树的二叉树组成。

二叉树的特点:每个结点最多有两棵子树,所以二叉树中不存在度大于2的结点。

二叉树的左右子树不能任意颠倒,如果某结点只有一棵子树,要指明是左子树还是右子树。

左斜树:所有结点都只有左子树的二叉树。

右斜树:所有结点都只有右子树的二叉树。

满二叉树:在一棵二叉树中,如果所有分支结点都存在左子树和右子树,并且所有叶子都在同一层上。

满二叉树特点:叶子只能出现在最下面一层。只有度为0和2的结点。

完全二叉树特点:深度为k的完全二叉树在k-1层是满二叉树。叶子结点只能出现在最下两层,而且最下层的叶子结点都集中在左侧连续的位置。如果有度为1的结点,只可能有一个,且该结点只有左孩子。

二叉树的性质

在一颗二叉树中,如果有n0个叶子,度为2的结点个数为n2,那么n0=n2+1

二叉树的第i层上最多有2的i-1次方个结点。

在一棵深度为i的二叉树中,做多有(2的k次方)-1个结点。

具有n个结点的完全二叉树的深度为log2n+1

二叉树的存储和遍历

前序遍历

先访问根结点

访问左子树

访问右子树

void PreOrder(BiNode* bt) {
    if (bt == NULL)return;
    else {
        cout << bt->data << endl;
        PreOrder(bt->lchild);
        PreOrder(bt->rchild);
    }
}

中序遍历

访问左子树

访问根结点

访问右子树

void InOrder(BiNode* bt) {
    if (bt == NULL)return;
    else {
        PreOrder(bt->lchild);
        cout << bt->data << endl;
        PreOrder(bt->rchild);
    }
}

后序遍历

访问左子树

访问右子树

访问根结点

void PostOrder(BiNode* bt) {
    if (bt == NULL)return;
    else {
        PreOrder(bt->lchild);
        PreOrder(bt->rchild);
        cout << bt->data << endl;
    }
}

全部代码:

#include<bits/stdc++.h>
using namespace std;
struct BiNode {
    int data;
    BiNode* lchild, * rchild;
};
void PreOrder(BiNode* bt) {
    if (bt == NULL)return;
    else {
        cout << bt->data << endl;
        PreOrder(bt->lchild);
        PreOrder(bt->rchild);
    }
}
void InOrder(BiNode* bt) {
    if (bt == NULL)return;
    else {
        PreOrder(bt->lchild);
        cout << bt->data << endl;
        PreOrder(bt->rchild);
    }
}
void PostOrder(BiNode* bt) {
    if (bt == NULL)return;
    else {
        PreOrder(bt->lchild);
        PreOrder(bt->rchild);
        cout << bt->data << endl;
    }
}

BiNode* Create() {
    BiNode* bt;
    char ch;
    cin >> ch;
    if (ch == '#')bt == NULL;
    else {
        bt = new BiNode; bt->data = ch;
        bt->lchild = Create();
        bt->rchild = Create();
    }
    return bt;
}
int main() {

    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

暗紫色的乔松(-_^)

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

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

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

打赏作者

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

抵扣说明:

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

余额充值