当前位置: 首页 > news >正文

【数据结构-树】二叉树的基本操作

文章目录

    • 1 链式存储的二叉树
      • 1.1 定义
      • 1.2 先序遍历
      • 1.3 中序遍历
      • 1.4 后序遍历
      • 1.5 层次遍历
    • 2 顺序存储的二叉树
      • 2.1 树的结点从数组下标 1 开始存储
        • 2.1.1 定义
        • 2.1.2 先序遍历
        • 2.1.3 中序遍历
        • 2.1.4 后序遍历
        • 2.1.5 层次遍历
        • 2.1.6 结点 i 的父结点
        • 2.1.7 结点 i 的左孩子
        • 2.1.8 结点 i 的右孩子
        • 2.1.9 结点 i 的层数
      • 2.2 树的结点从数组下标 0 开始存储
        • 2.2.1 定义
        • 2.2.2 先序遍历
        • 2.2.3 中序遍历
        • 2.2.4 后序遍历
        • 2.2.5 层次遍历
        • 2.2.6 结点 i 的父结点
        • 2.2.7 结点 i 的左孩子
        • 2.2.8 结点 i 的右孩子
        • 2.2.9 结点 i 的层数

1 链式存储的二叉树

1.1 定义

typedef struct BiTNode{
    int data;
    struct BiTNode *lchild;
    struct BiTNode *rchild;
} *BiTNode, BiTree;

1.2 先序遍历

void PreOrder (BiTree T){
    if (T != NULL){
        访问 T 结点;
        PreOrder(T->lchild);
        PreOrder(T->rchild);
    }
}

1.3 中序遍历

void InOrder (BiTree T){
    if (T != NULL){
        InOrder(T->lchild);
        访问 T 结点;
        InOrder(T->rchild);
    }
}

1.4 后序遍历

void PostOrder (BiTree T){
    if (T != NULL){
        PostOrder(T->lchild);
        PostOrder(T->rchild);
        访问 T 结点;
    }
}

1.5 层次遍历

void LevelOrder (BiTree T){
    Queue Q; // 辅助队列
    BiTree *TNode;
    
    InitQueue(Q);
    EnQueue(Q, T); // 根节点入队
    
    while (!Empty(Q)){
        DeQueue(Q, TNode); // 队头结点出队
        访问 TNode 结点;
        if (TNode->lchild != NULL)
            EnQueue(Q, TNode->lchild); // 左孩子入队
        if (TNode->rchild != NULL)
            EnQueue(Q, TNode->rchild); // 右孩子入队
    }
}

2 顺序存储的二叉树

2.1 树的结点从数组下标 1 开始存储

2.1.1 定义

#define MAX 50

typedef struct{
    int data;
    bool empty; // 记录结点是否为空
} TreeNode;

TreeNode T[MAX+1];
  • 初始化:
void InitTree (TreeNode &T){
    int i;
    for (i = 1; i <= MAX+1; i++)
        T[i].empty = true;
}

2.1.2 先序遍历

void PreOrder (TreeNode &T, int i){
    if (!T[i].empty){
        访问 T[i].data;
        
        if (2*i <= MAX)
            PreOrder(T, 2*i);
            
        if (2*i+1 <= MAX)
            PreOrder(T, 2*i+1);
    }
}

2.1.3 中序遍历

void InOrder (TreeNode &T, int i){
    if (!T[i].empty){
        if (2*i <= MAX)
            InOrder(T, 2*i);
            
        访问 T[i].data;
        
        if (2*i+1 <= MAX)
            InOrder(T, 2*i+1);
    }
}

2.1.4 后序遍历

void PostOrder (TreeNode &T, int i){
    if (!T[i].empty){
        if (2*i <= MAX)
            PostOrder(T, 2*i);
            
        if (2*i+1 <= MAX)
            PostOrder(T, 2*i+1);
            
        访问 T[i].data;
    }
}

2.1.5 层次遍历

void LevelOrder (TreeNode &T){
    int i;
    for (i = 1; i <= MAX; i++){
        if (!T[i].empty)
            访问 T[i].data;
    }
}

2.1.6 结点 i 的父结点

int FindFather (int i){
    return i / 2;
}

2.1.7 结点 i 的左孩子

int FindLeftChild (int i){
    return 2 * i;
}

2.1.8 结点 i 的右孩子

int FindRightChild (int i){
    return 2 * i + 1;
}

2.1.9 结点 i 的层数

int FindFloor (int i){
    return log(2, i) + 1; // log 以 2 为底的对数函数
}

2.2 树的结点从数组下标 0 开始存储

2.2.1 定义

#define MAX 50

typedef struct{
    int data;
    bool empty; // 记录结点是否为空
} TreeNode;

TreeNode T[MAX];
  • 初始化:
void InitTree (TreeNode &T){
    int i;
    for (i = 0; i < MAX; i++)
        T[i].empty = true;
}

2.2.2 先序遍历

void PreOrder (TreeNode &T, int i){
    if (!T[i].empty){
        访问 T[i].data;
        
        if (2*i+1 < MAX)
            PreOrder(T, 2*i+1);
            
        if (2*i+2 < MAX)
            PreOrder(T, 2*i+2);
    }
}

2.2.3 中序遍历

void InOrder (TreeNode &T, int i){
    if (!T[i].empty){
        if (2*i+1 < MAX)
            InOrder(T, 2*i+1);
            
        访问 T[i].data;
        
        if (2*i+2 < MAX)
            InOrder(T, 2*i+2);
    }
}

2.2.4 后序遍历

void PostOrder (TreeNode &T, int i){
    if (!T[i].empty){
        if (2*i+1 < MAX)
            PostOrder(T, 2*i+1);
            
        if (2*i+2 < MAX)
            PostOrder(T, 2*i+2);
            
        访问 T[i].data;
    }
}

2.2.5 层次遍历

void LevelOrder (TreeNode &T){
    int i;
    for (i = 0; i < MAX; i++){
        if (!T[i].empty)
            访问 T[i].data;
    }
}

2.2.6 结点 i 的父结点

int FindFather (int i){
    return (i - 1) / 2;
}

2.2.7 结点 i 的左孩子

int FindLeftChild (int i){
    return 2 * i + 1;
}

2.2.8 结点 i 的右孩子

int FindRightChild (int i){
    return 2 * i + 2;
}

2.2.9 结点 i 的层数

int FindFloor (int i){
    return log(2, i-1) + 1; // log 以 2 为底的对数函数
}

相关文章:

  • 死磕JAVA10余年,呕心整理出了核心知识点已经做成PDF,无私奉献
  • javaweb之ajax异步交互
  • 生产实用Shell脚本合集
  • 力扣 1856. 子数组最小乘积的最大值
  • Qt实现控件的折叠收起和展开的功能
  • #传输# #传输数据判断#
  • 腾讯高工用 4 部分就讲清楚了 Spring 全家桶 + 微服务
  • Linux(WSL)安装CUDA
  • Oracle VM VirtualBox Ubuntu设置共享文件夹
  • 【机器学习】DBSCAN聚类算法的理论/实现与调参
  • 32、Java——迷你图书管理器(对象+JDBC)
  • pycharm联合Anaconda
  • 不知道视频怎么转音频?手把手教你视频转音频
  • 【C++笔试强训】第十五天
  • 应用软件漏洞排名
  • [笔记] php常见简单功能及函数
  • 【JavaScript】通过闭包创建具有私有属性的实例对象
  • 【跃迁之路】【444天】程序员高效学习方法论探索系列(实验阶段201-2018.04.25)...
  • android 一些 utils
  • gitlab-ci配置详解(一)
  • Java Agent 学习笔记
  • k8s如何管理Pod
  • leetcode46 Permutation 排列组合
  • Spring技术内幕笔记(2):Spring MVC 与 Web
  • Vue ES6 Jade Scss Webpack Gulp
  • windows下使用nginx调试简介
  • 关于Java中分层中遇到的一些问题
  • 理清楚Vue的结构
  • 前嗅ForeSpider中数据浏览界面介绍
  • 浅谈Golang中select的用法
  • 网络应用优化——时延与带宽
  • 吴恩达Deep Learning课程练习题参考答案——R语言版
  • 用quicker-worker.js轻松跑一个大数据遍历
  • 06-01 点餐小程序前台界面搭建
  • Salesforce和SAP Netweaver里数据库表的元数据设计
  • ​力扣解法汇总946-验证栈序列
  • #HarmonyOS:Web组件的使用
  • #if #elif #endif
  • #微信小程序:微信小程序常见的配置传值
  • $var=htmlencode(“‘);alert(‘2“); 的个人理解
  • (¥1011)-(一千零一拾一元整)输出
  • (1)无线电失控保护(二)
  • (13)DroneCAN 适配器节点(一)
  • (C++17) std算法之执行策略 execution
  • (差分)胡桃爱原石
  • (创新)基于VMD-CNN-BiLSTM的电力负荷预测—代码+数据
  • (翻译)terry crowley: 写给程序员
  • (每日持续更新)jdk api之StringBufferInputStream基础、应用、实战
  • (转)memcache、redis缓存
  • (转)winform之ListView
  • (转)树状数组
  • (转)一些感悟
  • .Net Core缓存组件(MemoryCache)源码解析
  • .NET CORE使用Redis分布式锁续命(续期)问题
  • .NET Framework与.NET Framework SDK有什么不同?