• 技术文章 >常见问题

    二叉链表是二叉树的存储结构吗

    (*-*)浩(*-*)浩2019-10-26 10:48:38原创2627
    二叉链表是二叉树的存储结构。二叉链表是树的二叉链表实现方式(孩子兄弟表示法),以二叉链表作为树的存储结构。链表中结点的两个链域分别指向该结点的第一个孩子结点和第二个孩子结点。

    结构描述 (推荐学习:web前端视频教程

    typedef struct CSNode{
    ElemType data;
    struct CSNode *firstchild , *netsibling;
    } CSNode,* CSTree;

    由于二叉树的存储结构比较简单,处理起来也比较方便,所以有时需要把复杂的树,转换为简单的二叉树后再作处理。

    二叉链表的功能定义

    bitree.h

    //二叉链表定义
    #include <iostream>
    using namespace std;
    typedef char TElemType;
    struct BiTNode{
    TElemType data;
    BiTNode *lchild,*rchild;
    };
    typedef BiTNode *BiTree;
    void initBiTree(BiTree &T);
    void createBiTree(BiTree &T);
    void preOrderTraverse(BiTree T,void (*visit)(TElemType)); //递归前序遍历
    void preOrderTraverse1(BiTree T,void (*visit)(TElemType)); //非递归前序遍历
    void inOrderTraverse(BiTree T,void (*visit)(TElemType)); //递归中序遍历
    void postOrderTraverse(BiTree T,void (*visit)(TElemType)); //递归后序遍历
    void levelOrderTraverse(BiTree T,void (*visit)(TElemType)); //层序遍历
    bitree.cpp
    #include "bitree.h"
    void initBiTree(BiTree &T){ //构造空二叉树T
    T=NULL;
    }
    void createBiTree(BiTree &T){
    //按先序次序输入二叉树中结点的值('#'表示空格),构造二叉链表表示的二叉树T。
    TElemType ch;
    cin>>ch;
    if(ch=='#') // 空
    T=NULL;
    else{
    T=new BiTNode;
    if(!T)
    exit(1);
    T->data=ch; // 生成根结点
    createBiTree(T->lchild); // 构造左子树
    createBiTree(T->rchild); // 构造右子树
    }
    }
    void preOrderTraverse(BiTree T,void (*visit)(TElemType)){
    // 先序递归遍历T,对每个结点调用函数Visit一次且仅一次
    if(T){ // T不空
    visit(T->data); // 先访问根结点
    preOrderTraverse(T->lchild,visit); // 再先序遍历左子树
    preOrderTraverse(T->rchild,visit); // 最后先序遍历右子树
    }
    }
    void preOrderTraverse1(BiTree T,void (*visit)(TElemType)){
    //前序遍历二叉树T的非递归算法(利用栈),对每个数据元素调用函数Visit
    BiTree s[100];
    int top=0; //top为栈顶指针
    while((T!=NULL)||(top>0)){
    while(T!=NULL){
    visit(T->data);
    s[top++]=T;
    T=T->lchild;
    }
    T=s[--top];
    T=T->rchild;
    }
    }
    void inOrderTraverse(BiTree T,void (*visit)(TElemType)){
    //中序递归遍历T,对每个结点调用函数Visit一次且仅一次
    if(T){
    inOrderTraverse(T->lchild,visit); // 先中序遍历左子树
    visit(T->data); // 再访问根结点
    inOrderTraverse(T->rchild,visit); // 最后中序遍历右子树
    }
    }
    void postOrderTraverse(BiTree T,void (*visit)(TElemType)){
    //后序递归遍历T,对每个结点调用函数Visit一次且仅一次
    if(T){
    inOrderTraverse(T->lchild,visit); // 后序遍历左子树
    inOrderTraverse(T->rchild,visit); // 再后序遍历右子树
    visit(T->data); // 最后访问根结点
    }
    }
    void levelOrderTraverse(BiTree T,void (*visit)(TElemType)){
    //层序遍历T(利用队列),对每个结点调用函数Visit一次且仅一次
    BiTree q[100],p;
    int f,r; // f,r类似于头尾指针
    q[0]=T;
    f=0;
    r=1;
    while(f<r){
    p=q[f++]; //出队
    visit(p->data);
    if(p->lchild!=NULL)
    q[r++]=p->lchild; //入队
    if(p->rchild!=NULL)
    q[r++]=p->rchild; //入队
    }
    }

    以上就是二叉链表是二叉树的存储结构吗的详细内容,更多请关注php中文网其它相关文章!

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    专题推荐:二叉树
    上一篇:防火墙的作用是防止不希望的、未授权的通信进出被保护的网络对吗 下一篇:处理器调度的最小单位

    相关文章推荐

    • php如何利用递归实现二叉树的创建• php如何实现二叉树的创建(代码实例)• Python实现二叉树的算法实例• 二叉树的基本性质

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网