美文网首页
链式二叉树的前中后续遍历

链式二叉树的前中后续遍历

作者: 羽裳有涯 | 来源:发表于2019-12-15 10:44 被阅读0次

前言

三种遍历

链式二叉树又称二叉链表,遍历有三种,分别是前序(先序),中序,后序。

定义二叉树的存储结构为链式存储

1 typedef struct BiNode{
2     int data;
3     BiNode *lchild,*rchild;   //左孩子和右孩子
5 }BiNode;
6 typedef struct BiNode* BiTree;

我们往往在创建之前要先初始化一下

/*初始化并建立二叉树*/
int index=0;
void CreateBiTree(BiTree* T,char data[]){
    *T =NULL;   //初始化为空
    char ch;
    if(index<strlen(data)){
        ch = data[index++];
    }else{
        return;
    }
    if(ch =='#')      //此节点为空
        *T =NULL;
    else{
        *T = (BiTree)malloc(sizeof(BiNode));
        if(!*T)
            exit(0);
        (*T)->data=ch;  //生成根节点
        CreateBiTree(&(*T)->lchild,data);
        CreateBiTree(&(*T)->rchild,data);        
    }
}

先序

先序:
1.访问根结点

2.访问左子树

3.访问右子树

总结三个字:中左右


/*先序遍历*/
void PreOrderTraverse(BiTree T){
    if(T ==NULL)
        return;
    printf("%c ",T->data);
    PreOrderTraverse(T->lchild);
    PreOrderTraverse(T->rchild);
}

中序

中序:1.访问左子树

2.访问根结点

3.访问右子树

总结三个字:左中右

/*中序遍历*/
void InOrderTraverse(BiTree T){
    if(T ==NULL)
        return;
    InOrderTraverse(T->lchild);
    printf("%c ",T->data);
    InOrderTraverse(T->rchild);
}

后序

后序:
1.访问左子树
2.访问右子树
3.访问根

总结三个字:左右中

/*后序遍历*/
void PostOrderTraverse(BiTree T){
    if(T ==NULL)
        return;
    PostOrderTraverse(T->lchild);
    PostOrderTraverse(T->rchild);
    printf("%c ",T->data);
}

对二叉树进行一些其他的操作

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct BiNode{
    int data;
    BiNode *lchild,*rchild;

}BiNode;
typedef struct BiNode* BiTree;

/*初始化并建立二叉树*/
int index=0;
void CreateBiTree(BiTree* T,char data[]){
    *T =NULL;   //初始化为空
    char ch;
    if(index<strlen(data)){
        ch = data[index++];
    }else{
        return;
    }
    if(ch =='#')      //此节点为空
        *T =NULL;
    else{
        *T = (BiTree)malloc(sizeof(BiNode));
        if(!*T)
            exit(0);
        (*T)->data=ch;  //生成根节点
        CreateBiTree(&(*T)->lchild,data);
        CreateBiTree(&(*T)->rchild,data);        
    }
}

/*判断是否为空二叉树*/
int BiTreeEmpty(BiTree T){
    if(T){
        return 0;
    }
    return 1;
}

/* 初始条件: 二叉树T存在。操作结果: 返回T的根 */
char Root(BiTree T){
    if(BiTreeEmpty(T))
        return NULL;
    else
        return T->data;
}

/* 初始条件: 二叉树T存在。操作结果: 返回T的深度 */
int BiTreeDepth(BiTree T){
    int i,j;
    //没有根节点
    if(!T){
        return 0;
    }
    if(T->lchild){
        i = BiTreeDepth(T->lchild);
    }else{
        j=0;
    }
    if (T->rchild){
        j = BiTreeDepth(T->rchild);
    }else{
        i=0;
    }
    return i>j ?i+1:j+1;
}

/*先序遍历*/
void PreOrderTraverse(BiTree T){
    if(T ==NULL)
        return;
    printf("%c ",T->data);
    PreOrderTraverse(T->lchild);
    PreOrderTraverse(T->rchild);
}

/*中序遍历*/
void InOrderTraverse(BiTree T){
    if(T ==NULL)
        return;
    InOrderTraverse(T->lchild);
    printf("%c ",T->data);
    InOrderTraverse(T->rchild);
}
/*后序遍历*/
void PostOrderTraverse(BiTree T){
    if(T ==NULL)
        return;
    PostOrderTraverse(T->lchild);
    PostOrderTraverse(T->rchild);
    printf("%c ",T->data);
}

/* 初始条件: 二叉树T存在。操作结果: 销毁二叉树T */
void DestroyBiTree(BiTree *T){
    if(*T){
        if((*T)->lchild){   //有左孩子
            DestroyBiTree(&(*T)->lchild);   //销毁左孩子子树
        }
        if((*T)->rchild){
            DestroyBiTree(&(*T)->rchild);
        }
        free(*T);  /* 释放根结点 */
        *T = NULL;  //指向0
    }
}

int main(){
    BiTree tree;
    int i;
    char data[] = "ABDH#K###E##CFI###G#J##";
    //InitBiTree(&tree);
    CreateBiTree(&tree,data);
    printf("树是否为空:(1 或 0):%d\n",BiTreeEmpty(tree));
    printf("树的深度为:%d\n",BiTreeDepth(tree));
    printf("此时树的头结点为:%c\n",Root(tree));

    printf("先序遍历:");
    PreOrderTraverse(tree);
    printf("\n");

    printf("中序遍历:");
    InOrderTraverse(tree);
    printf("\n");

    printf("后序遍历:");
    PostOrderTraverse(tree);
    printf("\n");

    printf("销毁二叉树\n");
    DestroyBiTree(&tree);
    printf("树是否为空:(1 或 0):%d\n",BiTreeEmpty(tree));
    return 0;
}

相关文章

  • 链式二叉树的前中后续遍历

    前言 三种遍历 链式二叉树又称二叉链表,遍历有三种,分别是前序(先序),中序,后序。 定义二叉树的存储结构为链式存...

  • 一般二叉树普通二叉树,前、中、后序遍历以及搜索 顺序存储二叉树将数组以树的思想标识,包括前、中、后续遍历 线索化二...

  • 二叉树遍历

    请递归,非递归方式分别前序遍历,中序遍历,后续遍历二叉树

  • 算法精选题总结之二叉树类

    1.二叉树的中序遍历中序遍历的迭代方法中序遍历的递归方法2.二叉树前序遍历3.二叉树后续遍历4.二叉树的最近公共祖...

  • 二叉树相关算法

    二叉树定义 前序遍历(中序遍历、后续遍历只需要调整append的顺序即可) 层序遍历 二叉树的最大深度 对称二叉树...

  • 剑指offer 面试题6:重建二叉树

    题目:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。 解法:前序遍历:根左右中序遍历:左根右后续遍历:...

  • 二叉树(python实现)

    一、二叉树的几种遍历方式 1、前序遍历(根——>左——>右) 2、中序遍历(左——>根——>右) 3、后续遍历(左...

  • 二叉树的非前、中、后序遍历

    本篇文章介绍二叉树中除了前序、中序、后续遍历以外的其他一些遍历方式。 首先,还是定义树的节点如下 按层遍历二叉树 ...

  • 二叉树遍历java,非递归、层次。

    /** * 前序遍历 * 递归 */ /*** 前序遍历* 非递归*/ 后续遍历非递归 二叉树层次遍历基于java...

  • 二叉树的三种遍历(前序/中序/后序)

    参考博客 二叉树的非递归后续遍历

网友评论

      本文标题:链式二叉树的前中后续遍历

      本文链接:https://www.haomeiwen.com/subject/naqagctx.html