[数据结构]树和二叉树

树基本定义

  1. n个结点的最小无环图
  2. 根结点没有前驱,其他结点有且仅有一个前驱
  3. 一个结点的子结点个数称为该结点的,树中结点的最大度称为树的度
  4. 度大于0的结点称为分支结点,度为0的结点称为叶子结点(终端结点)
  5. 结点的层次从树根开始定义(根结点为第一层),深度从根结点自顶向下累加,高度从叶结点自底向上累加
  6. 路径是两结点之间经过的结点序列,路径长度是路径上经过的边的个数

树的性质

  1. 树中结点数=结点度数和+1
  2. 度为m的树中第i层上至多有m^{i-1}个结点(i >= 1)
  3. 高度为h的m叉树至多有 (m^h-1)(m-1) 个结点
  4. 具有n个结点的m叉树的最小高度为 log_m(n * (m-1) + 1)

二叉树

  1. 度为2,结点有左右之分
  2. 二叉树!=度为2的有序树
  3. 满二叉树:高为h,且含有2^h-1个结点
  4. 完全二叉树:n个结点,高度h,且每个结点都与高度为h的满二叉树中编号为1~n的结点一一对应
    1. [n/2]+1~n为叶子结点(叶子结点只出现在层次最大的两层)
    2. 最多有一个度为1的结点(n必为偶数且结点编号必为n/2),且该结点有左孩子无右孩子

二叉树性质

  1. 非空二叉树的叶子结点数=度为2的结点数+1(n_0 = n_2 + 1)
  2. 总结点数 n = n_1 + 2 * n_2 + 1
  3. 由上式又可推得n_1(度为1的结点数)必为奇数

二叉树的存储结构

顺序存储

  1. 适合完全二叉树和满二叉树
  2. 编号为i(i > 1)的结点的父结点为[i/2],i为偶数是左孩子,i为奇数是右孩子
  3. 相应的,结点i的左孩子编号为2i,右孩子为2i+1

链式存储结构

typedef struct BiTNode{
    ElemType data;
    struct BiTNode *lchild, * rchild;
}BiTNode, * BiTree;

二叉树的遍历

NLR先序遍历

void preOrder(BiTree T){
    if(T != NULL){
        visit(T);
        preOrder(T->lchild);
        preOrder(T->rchild);
    }
}

LNR中序遍历

void inOrder(BiTree T){
    if(T != NULL){
        preOrder(T->lchild);
        visit(T);
        preOrder(T->rchild);
    }
}

LRN后序遍历

void postOrder(BiTree T){
    if(T != NULL){
        preOrder(T->lchild);
        preOrder(T->rchild);
        visit(T);
    }
}

线索二叉树

规定:若无左子树,令lchild指向其前驱结点;若无右子树,令rchild指向其后继结点。同时增加两个标识位表明指针含义
以中序线索二叉树为例:

void inThread(ThreadTree &p, ThreadTree &pre){
    if(p != NULL){
        inThread(p->lchild,pre); 
        if(p->lchild == NULL){
            p->lchild = pre;
            p->ltag = true;
        }
        if(pre != NULL && pre->rchild == NULL){
            pre->rchild = p;
            pre->rtag = true;
        }
        pre = p;
        inThread(p->rchild, pre);
    }
}

//调用和尾结点处理
void createInThread(ThreadTree T){
    ThreadTree pre = NULL;
    if(T != NULL){
        inThread(T);
        pre->rchild = NULL;
        pre=>rtag = 1;
    }
}

遍历中序线索二叉树时,若右标志为真,后继为rchild所指结点,否则为rchild最坐下的结点。
遍历先序线索二叉树时,有左孩子时左孩子为后继,只有右孩子时右孩子为后继,叶子节点的右链域为后继
遍历后序线索二叉树时,右孩子或没有右兄弟的左孩子后继为其父结点,有右兄弟的左孩子后继为其右兄弟

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值