美文网首页
二叉树的建立和遍历算法

二叉树的建立和遍历算法

作者: AceKitty | 来源:发表于2017-02-15 23:32 被阅读212次

建立二叉树并输出每个字符所在的层数。如下图要求输出A在第一层 B,C在第二层 D,E在第三层

图片.png

代码实现如下:

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

typedef char ElemType;

typedef struct BiTNode {
    char data;
    struct BiTNode *lchild, *rchild;
}BiTNode, *BiTree;
//创建一颗二叉树,约定用户遵照前序遍历的方式输入数据
void CreateBiTree(BiTree *T) {
    char c;
    scanf_s("%c", &c);
    if (' ' == c) 
    {
        *T = NULL;
    }
    else
    {
        *T = (BiTNode *)malloc(sizeof(BiTNode));
        (*T)->data = c;
        CreateBiTree(&(*T)->lchild);
        CreateBiTree(&(*T)->rchild);
    }
}
//访问二叉树节点的具体操作,你想干嘛
void visit(ElemType elem, int level) {
    printf("%c 位于第%d层\n", elem, level);
}
//前序遍历二叉树
void PreOrderTraverse(BiTree T, int level) {
    if (T)
    {
        visit(T->data, level);
        PreOrderTraverse(T->lchild, level + 1);
        PreOrderTraverse(T->rchild, level + 1);
    }
}

int main() {
    int level = 1;
    BiTree T = NULL;
    CreateBiTree(&T);
    PreOrderTraverse(T, level);
    getchar();
    getchar();
    return 0;
}

线索二叉树

图片.png

-ltag为0时指向该节点的左孩子,为1时指向该节点的前驱
-rtag为0时指向该节点的右孩子,为1时指向该节点的后继

代码实现

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

typedef char ElemType;
typedef int PointerTag;
//线索存储标志位 
//link(0):表示指向左右孩子的指针
//Thread(1): 表示指向前驱后继的线索
typedef enum {Link, Thread};
typedef struct BiThrNode {
    char data;
    struct BiThrNode *lchild, *rchild;
    PointerTag ltag;
    PointerTag rtag;
}BiThrNode, *BiThrTree;

//全局变量,始终指向刚刚访问过的节点
BiThrTree pre;

//创建一颗二叉树 约定用户遵照前序遍历的方式输入数据
void CreateBiThrTree(BiThrTree *T) {
    char c;
    scanf_s("%c", &c);
    if (' ' == c)
    {
        *T = NULL;
    }
    else
    {
        *T = (BiThrNode *)malloc(sizeof(BiThrNode));
        (*T)->data = c;
        (*T)->ltag = Link;
        (*T)->rtag = Link;

        CreateBiThrTree(&(*T)->lchild);
        CreateBiThrTree(&(*T)->rchild);
    }
}

void InThreading(BiThrTree T) {
    if (T)
    {
        InThreading(T->lchild); //递归左孩子线索化
        //节点处理
        if (!T->lchild)    //如果该节点没有左孩子,设置ltag为Thread, 并把lchild指向刚刚访问的节点
        {
            T->ltag = Thread;
            T->lchild = pre;
        }
        if (!pre->rchild)
        {
            pre->rtag = Thread;
            pre->rchild = T;
        }
        pre = T;

        InThreading(T->rchild); //递归右孩子线索化
    }
}
void InOrderThreading(BiThrTree *p, BiThrTree T) {
    *p = (BiThrTree)malloc(sizeof(BiThrNode));
    (*p)->ltag = Link;
    (*p)->rtag = Thread;
    (*p)->rchild = *p;
    if (!T) {
        (*p)->lchild = *p;
    }
    else
    {
        (*p)->lchild = T;
        pre = *p;
        InThreading(T);
        pre->rchild = *p;
        pre->rtag = Thread;
        (*p)->rchild = pre;
    }
}

void visit(char c) {
    printf("%c", c);
}

//中序遍历二叉树 非递归
void InOrderTraverse(BiThrTree T) {
    BiThrTree p;
    p = T->lchild;
    while (p != T)
    {
        while (p->ltag == Link)
        {
            p = p->lchild;
        }
        visit(p->data);
        while (p->rtag == Thread && p->rchild != T)
        {
            p = p->rchild;
            visit(p->data);
        }
        p = p->rchild;
    }
}
int main() {
    BiThrTree P, T = NULL;
    CreateBiThrTree(&T);
    InOrderThreading(&P, T);
    printf("中序遍历结果为:");
    InOrderTraverse(P);

    getchar();
    getchar();
    return 0;
}

相关文章

  • 记一次Tree的遍历

    统计利用先序遍历创建的二叉树的深度 利用先序递归遍历算法创建二叉树并计算该二叉树的深度。先序递归遍历建立二叉树的方...

  • 数据结构实验2:二叉树的应用

    实验内容: 1.输入字符序列,建立二叉链表。2.中序遍历二叉树:递归算法。3.中序遍历二叉树:非递归算法。(最好也...

  • Java中用递归和迭代实现二叉树的中序( InOrder )遍历

    与数组和链表不同,二叉树有几种遍历方式。遍历算法大致分为深度优先和广度优先遍历算法,这取决于算法实际如何工作。顾名...

  • 二叉树遍历(递归算法和非递归算法)

    实验三 二叉树遍历(递归算法和非递归算法) 一.实验目的 1.掌握二叉树的存储结构与基本操作 2.掌握二叉树的遍历...

  • 二叉树的建立 建立二叉树,利用了递归的原理,也就是在打印二叉树的前中后序遍历算法中打印结点的地方,改成了生成结点,...

  • 二叉树遍历-JAVA实现

    基础二叉树 二叉树遍历分为前序、中序、后序递归和非递归遍历、还有层序遍历。 前序递归遍历算法:访问根结点-->递归...

  • 数据结构题目45:二叉树的建立

    题目: 建立一棵二叉树。 解题思路:用单个字符表示二叉树中一个结点的数据,这里采用前序遍历算法。建立二叉树的过程如...

  • 算法-二叉树算法总结

    二叉树算法总结 1 二叉树的遍历 1.1 前序遍历 递归 迭代 1.2 中序遍历 递归 迭代 1.3 后序遍历 递...

  • ALI 算法

    二叉树遍历算法: 按层遍历, 中序前序后序:

  • 剑指offer中关于二叉树题目的总结

    关于二叉树的问题,也就是涉及二叉树的四种遍历算法以及基本的删除、插入等操作 中序遍历和前序遍历/后序遍历的结合 题...

网友评论

      本文标题:二叉树的建立和遍历算法

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