【数据结构】之树的介绍

目录

二叉树

满二叉树

完全二叉树

二叉树的链式存储

二叉树的遍历


树的定义:一棵树是若干个结点的集合,它由唯一的根结点与若干互不相交的子树组成。其中每棵子树也是由唯一的根结点与若干个互不相干的子树构成。树的定义是递归的。

结点的度:结点拥有子树的个数

叶结点:结点度为零的结点

二叉树

 

二叉树:属于树,且满足:1)每个节点至多两个子树。2)二叉树是有序的,左右子树不能颠倒。

性质:1)二叉树第n层结点数至多为2^{^n-1}。2)深度为n的二叉树结点最多为2^{n}-1。

满二叉树

满二叉树:属于二叉树,且满足:1)除了叶结点,其他结点均有左右孩子。2)叶结点都在二叉树的最底层,且叶结点数为该层的最大值。如下则为一个满二叉树例子:

完全二叉树

完全二叉树:属于二叉树,并且满足,如果对其结点按照“从上往下,从左向右”编号后与满二叉树的结点编号相同。则属于完全二叉树,否则为非完全二叉树。

满二叉树
非完全二叉树
完全二叉树

 

ps:有关二叉树结点的运算,需要知道二叉树的总结点数=总分支数+1,除了根结点,其他每个结点都对应唯一一个指向自己的分支。

二叉树的链式存储

leftvalright

 

 

typedef struct BTNode{
 int val
 struct BTNode *left *right;
}BTNode,*BiTNode

二叉树的遍历

先序遍历(访问根结点→先序遍历左子树→先序遍历右子树)

void PreOrder(BTNode *t){
 if(t!==NULL){
    visit(t->val);
    PreOrder(t->left);
    PreOrder(t->right);
    }
}

中序遍历(中序遍历左子树→访问根结点→中序遍历右子树)

void PreOrder(BTNode *t){
 if(t!==NULL){
    PreOrder(t->left);
    visit(t->val);
    PreOrder(t->right);
    }
}

后序遍历(后序遍历左子树→后序遍历右子树→访问根结点)

void PreOrder(BTNode *t){
 if(t!==NULL){
    PreOrder(t->left);
    PreOrder(t->right);
    visit(t->val);
    }
}

层次遍历(第一步:初始化队列,将根结点入队。第二步:若队列不空,则队列头结点p出队,若p左孩子不空则入队,右孩子不空则入队。第三步:循环第二步,队列为空结束)

void LevelOrder(BTNode *t){
    if(t==NULL) return 0;
    BTNode *p;
    queue<BTNode *> Q;
    Q.push(t);//根结点入队
    while(!Q.empty()){//队列不为空继续执行
        p=Q.front();
        Q.pop();
        visit(p->val)//访问结点
        if(p->left!=NULL) Q.push(p->left);//结点左孩子不为空则入队
        if(p->right!=NULL) Q.push(p->right)//结点右孩子不为空则入队
        }
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值