数据结构-二叉树的遍历

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zwx19921215/article/details/83306202

二叉树是每个结点最多有两个子树的树结构。通常子树被称作“左子树”(left subtree)和“右子树”(right subtree)。二叉树常被用于实现二叉查找树和二叉堆。
二叉树的每个结点至多只有二棵子树(不存在度大于2的结点),二叉树的子树有左右之分,次序不能颠倒。二叉树的第i层至多有2^{i-1}个结点;深度为k的二叉树至多有2^k-1个结点;对任何一棵二叉树T,如果其终端结点数为n_0,度为2的结点数为n_2,则n_0=n_2+1。

一棵深度为k,且有2^k-1个节点的二叉树,称为满二叉树。这种树的特点是每一层上的节点数都是最大节点数。而在一棵二叉树中,除最后一层外,若其余层都是满的,并且最后一层或者是满的,或者是在右边缺少连续若干节点,则此二叉树为完全二叉树。具有n个节点的完全二叉树的深度为log2n+1。深度为k的完全二叉树,至少有2^(k-1)个节点,至多有2^k-1个节点。

-摘自百科

二叉树的其它的特性我就不多做介绍了,详情请大家自行搜索!

此处着重介绍二叉树的遍历,二叉树的遍历存在四种方式:

先序遍历:访问根节点->遍历左子树->遍历右子树

中序遍历:遍历左子树->访问根节点->遍历右子树

后序遍历:遍历左子树->遍历右子树->访问根节点

如上图所示的二叉树

采用先序遍历的结果为:ABDHIEJCFKG

采用中序遍历的结果为:HDIBEJAFKCG

采用后序遍历的结果为:HIDJEBKFGCA

下面首先通过C语言简单实现二叉树的初始化创建和先序遍历的方式输出每个节点所在树的层次:

//
// Created by Administrator on 2018/6/5.
//

#include "stdio.h"
#include "stdlib.h"

/**
 * 创建一棵二叉树并输出每个节点所在二叉树的层次
 * 输入方式:ABDH##I##E#J##CF#K##G##
 */

#define ElementType char
typedef struct {
    ElementType data;
    struct BitTreeNode *lchild, *rchild;
} BitTreeNode, *BitTree;

/**
 * 创建一棵二叉树:先序遍历的方式
 * @param tree
 * @return 二叉树
 */
BitTree createBitTree(BitTree tree) {
    char c;
    scanf("%c", &c);
    if ('#' == c) {
        return 0;
    } else {
        tree = (BitTree) malloc(sizeof(BitTreeNode));
        tree->data = c;
        tree->lchild = createBitTree(tree->lchild);
        tree->rchild = createBitTree(tree->rchild);
    }
    return tree;
}

/**
 * 打印结果
 * @param data 节点元素
 * @param level 所在层数
 */
void printLevel(char data, int level) {
    printf("%c 在第 %d 层\n", data, level);
}


/**
 * 先序遍历
 * @param tree
 * @param level
 */
void preOrder(BitTree tree, int level) {
    if (tree) {
        printLevel(tree->data, level);
        preOrder(tree->lchild, level + 1);
        preOrder(tree->rchild, level + 1);
    }
}


int main() {
    int level = 1;
    BitTree tree;
    tree = createBitTree(tree);
    printf("先序遍历结果:\n");
    preOrder(tree, level);
    return 0;
}

接下来实现二叉树的三种遍历方式:

//
// Created by Administrator on 2018/6/5.
//
/**
 * 二叉树的三种遍历方式:先序遍历、中序遍历、后序遍历
 */
#include "stdio.h"
#include "stdlib.h"

#define ElementType char
typedef struct {
    ElementType data;
    struct BitTreeNode *lchild, *rchild;
} BitTreeNode, *BitTree;

/**
 * 创建一棵二叉树:通过先序遍历的方式创建
 * @param tree
 * @return 二叉树
 */
BitTree createBitTree(BitTree tree) {
    char c;
    scanf("%c", &c);
    if ('#' == c) {
        return 0;
    } else {
        tree = (BitTree) malloc(sizeof(BitTreeNode));
        tree->data = c;
        tree->lchild = createBitTree(tree->lchild);
        tree->rchild = createBitTree(tree->rchild);
    }
    return tree;
}

/**
 * 访问节点
 * @param data 节点数据
 */
void visit(char data) {
    printf("%c", data);
}

/**
 * 先序遍历
 * @param tree
 */
void preOrder(BitTree tree) {
    if (tree) {
        visit(tree->data);
        preOrder(tree->lchild);
        preOrder(tree->rchild);
    }
}

/**
 * 中序遍历
 * @param tree
 */
void inOrder(BitTree tree) {
    if (tree) {
        inOrder(tree->lchild);
        visit(tree->data);
        inOrder(tree->rchild);
    }
}

/**
 * 后序遍历
 * @param tree
 */
void postOrder(BitTree tree) {
    if (tree) {
        postOrder(tree->lchild);
        postOrder(tree->rchild);
        visit(tree->data);
    }
}

int main() {
    BitTree tree;
    tree = createBitTree(tree);
    printf("先序遍历结果:");
    preOrder(tree);
    printf("\n");
    printf("中序遍历结果:");
    inOrder(tree);
    printf("\n");
    printf("后序遍历结果:");
    postOrder(tree);
    printf("\n");
    return 0;
}

好了,以上就是二叉树的集中遍历方式,如果有小伙伴有疑问的可以关注公众号,我们在群里面一起探讨交流哦!

猜你喜欢

转载自blog.csdn.net/zwx19921215/article/details/83306202