二叉树的遍历以及遍历算法的应用(链式存储结构)

目录

 一、二叉树的遍历(递归算法)

1.1 DLR先序遍历

1.2 LDR中序遍历

1.3 LRD中序遍历

二、遍历算法的应用

2.1 输出二叉树中的结点

2.2 输出二叉树中的叶结点 

2.3 统计叶结点数目

2.4 二叉树的创建

2.4.1 介绍:先序定位串

2.4.2 算法实现

2.5 二叉树的销毁

2.6 求二叉树的高度


一、二叉树的遍历(递归算法)

1.1 DLR先序遍历

若二叉树为空,则为空操作,否则依次执行如下三个操作:

1、访问根结点;

2、按先序遍历左子树;

3、按先序遍历右子树。

/* DLR先序遍历 */
void PreOrder(BiTree root) {
    if (root == NULL) return;

    Visit(root->data);
    PreOrder(root->LChild);
    PreOrder(root->RChild);
}

1.2 LDR中序遍历

若二叉树为空,则为空操作,否则依次执行如下三个操作:

1、按中序遍历左子树;

2、访问根结点;

3、按中序遍历右子树。

/* LDR中序遍历 */
void InOrder(BiTree root) {
    if (root == NULL) return;

    InOrder(root->LChild);
    Visit(root->data);
    InOrder(root->RChild);
}

1.3 LRD中序遍历

若二叉树为空,则为空操作,否则依次执行如下三个操作:

1、按后序遍历左子树;

2、按后序遍历右子树;

3、访问根结点。

/* LRD后序遍历 */
void PostOrder(BiTree root) {
    if (root == NULL) return;

    PostOrder(root->LChild);
    PostOrder(root->RChild);
    Visit(root->data);
}

二、遍历算法的应用

2.1 输出二叉树中的结点

先序遍历输出二叉树中的结点。

void PreOrder(BiTree root) {
    if (root == NULL) return;

    print(root->data);
    PreOrder(root->LChild);
    PreOrder(root->RChild);
}

2.2 输出二叉树中的叶结点 

先序遍历输出二叉树中的叶结点。

void PreOrder(BiTree root) {
    if (root == NULL) return;

    if (root->LChild == NULL && root->RChild == NULL)
        print(root->data);
    PreOrder(root->LChild);
    PreOrder(root->RChild);
}

2.3 统计叶结点数目

先序遍历统计叶结点数目。

void GetLeavesNum(BiTree root, int *num) {
    if (root == NULL) return;

    if (root->LChild == NULL && root->RChild == NULL)
        ++ *num; /* 由于num要从函数中带出,因此使用指针类型 */

    GetleavesNum(root->LChild, num);
    GetleavesNum(root->RChild, num);
}

2.4 二叉树的创建

2.4.1 介绍:先序定位串

给定一棵二叉树,可以得到它的遍历序列;反过来,给定一棵二叉树的遍历序列,也就可以创建相应的二叉链表。

这里所说的遍历序列是一种扩展的遍历序列。在通常的遍历序列中均忽略空子树,而在扩展的遍历序列中,必须用特定的元素表示空子树,如小圆点 “.” 。

示例:


2.4.2 算法实现

利用扩展的先序遍历序列创建二叉链表。

BiTree _CreateByStr(char *nodes, int *i) {
    /* 判空 */
    if (nodes[*i] == '\0') return NULL;

    /* '.'代表这颗子树是空树 */
    if (nodes[*i] == '.') {
        ++ *i; /* 每消费一个字符,下标*i要后移 */
        return NULL;
    }

    /* 生成新结点 */
    BiTree root = (BiTree)malloc(sizeof(BiTNode));
    root->data = *find_ref_entry(nodes[*i]);
    
    ++ *i;
    /* 递归生成子树 */
    root->LChild = _CreateByStr(nodes, i); /* 生成左子树 */
    root->RChild = _CreateByStr(nodes, i); /* 生成右子树 */

    return root;
}

递归过程示意图: 


2.5 二叉树的销毁

后序遍历销毁二叉树。

void DestroyBiTree(BiTree root) {
    /* 递归终止条件 */
    if (root == NULL) return;

    DestroyBiTree(root->LChild);
    DestroyBiTree(root->RChild);
    free(root);
}

2.6 求二叉树的高度

二叉树的高度为二叉树中结点层次的最大值,也可视为其左、右子树高度的最大值加1。

分治法求二叉树的高度。

int TreeHeight(BiTree root) {
    if(root == NULL) return 0;

    int hl = TreeHeight(root->LChild); /* 求左子树的高度 */
    int hr = TreeHeight(root->RChild); /* 求右子树的高度 */
    return (hl > hr ? hl : hr) + 1;
}
  • 0
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值