【3月第四周学习记录】数据结构与算法王卓-第五章树和二叉树-二叉树的遍历(算法实现篇)

1. 建立二叉树

算法描述

参数共一个:树名。效果为建立一颗二叉树。以按先序遍历序列建立二叉树为例:

已知先序序列为:ABCDEGF,则可以建立n种二叉树,例如:

【3月第四周学习记录】数据结构与算法王卓-第五章树和二叉树-二叉树的遍历(算法实现篇)_第1张图片

当然,结果是不唯一的,且不止以上两种。

为了避免这种情况,建立出目标二叉树,应该将空结点也输入:

【3月第四周学习记录】数据结构与算法王卓-第五章树和二叉树-二叉树的遍历(算法实现篇)_第2张图片

所以输入时,就不能输入ABCDEGF,而要在其中按顺序插入空结点。这就是已知序列建立二叉树的第一步:从键盘中输入二叉树的结点信息(包含何处为空结点)建立二叉树的存储结构。

Tip:空结点可以用空格,#号等符号表示

代码表示

Status CreateBT(BiTree &T){
    char a; cin >> a;
    if(a == '#') T->data = NULL;
    else{
        if(!(T = new BTNode))
            return ERROR;
        T->data = a;
        CreateBT(T->lchild);
        CreateBT(T->rchild);
    }
    return OK;
}

【3月第四周学习记录】数据结构与算法王卓-第五章树和二叉树-二叉树的遍历(算法实现篇)_第3张图片

2. 复制二叉树 

算法描述

参数共两个:原树名,和新树名。效果为复制一个二叉树

算法思路

1. 检测是否是空树

2. 申请新空间

3. 建立根节点。开始递归复制左子树,递归复制右子树

代码实现

引用自身完成递归

int CopyBT(BiTree T, BiTree &N){
    if(!T) {N = NULL; return 0;}
    else{
        if(!(N = new BTNode)) return ERROR;
        N->data = T->data;
        Copy(T->lchild, N->lchild);
        Copy(T->rchild, N->rchild);
    }
    //注意,这里不能return 0,应该由第一行if空时结束
}

【3月第四周学习记录】数据结构与算法王卓-第五章树和二叉树-二叉树的遍历(算法实现篇)_第4张图片

3. 计算二叉树的深度 

算法描述

参数共一个:原树名。效果为获得一棵树的深度。

算法思路

1. 检测是否为空树

2. 访问根节点,获取左右子树

3. 递归访问左子树,每访问到一次非空结点,深度+1,最终获取深度为m;同样方法访问右子树,获取深度为n。

4. 比较m与n,树的深度为较大者+1(根节点)

代码实现

笔者按:能写出来这样的代码,细思极恐,恐怖的一

通过返回值使递归函数本身发挥了一个计数器的作用

int BiTreeDepth(BiTree T){
    if (!T) return 0;
    else{
        int m = BiTreeDepth(T->lchild);
        int n = BiTreeDepth(T->rchild);
        (m>n) ? return (m + 1): return (n + 1);
    }
}

4. 计算二叉树结点总个数

算法描述

参数共一个:原树名。效果为获得一棵树的结点总数。

算法思路

1. 若为空树,结点n=0;

2. 若非空,结点=左+右+1

代码实现

笔者按:想了半天,按照第三节的思路写出三行代码,以为已经是极简了,看到老师的直接吐血

int BTCnt(BiTree T){
    (!T) ? return 0 : return (BTCnt(T->lchild) + BTCnt(T->rchild) + 1);
}

5. 计算二叉树叶子总个数

算法描述

参数共一个:原树名。效果为获得一棵树的叶子总数。

算法思路

1. 若为空树,返回0;

2. 若非空,访问左子树,访问右子树,判断是否为叶子,若为叶子return 1; 若不为叶子=左+右。

代码实现

int BTCntL(BiTree T){
    if(!T) return 0;                                //空结点,返回0
    else if(!(T->lchild) && !(T->rchild)) return 1; //左右子树都空,为叶子
    else return BTCntL(T->lchild) + BTCntL(T->rchild);
}

你可能感兴趣的:(二叉树,算法,数据结构,结点)