概念

树是 n ( n ≥ 0 ) n(n \geq 0) n(n≥0) 个结点的有限集合 T ( T r e e ) T(Tree) T(Tree) 。当 n = 0 n=0 n=0 时,称为空树;当 n > 0 n>0 n>0 时, 该集合满足如下条件:

  1. 其中必有一个称为 根(root) 的特定结点,它没有直接前驱,但有零个或多个直接后继。
  2. 其余 n − 1 n-1 n−1 个结点可以划分成 m ( m ≥ 0 ) m(m \geq 0) m(m≥0)个互不相交的有限集 T 1 , T 2 , T 3 , ⋯ , T m T_{1},T_{2},T_{3},\cdots ,T_{m} T1​,T2​,T3​,⋯,Tm​ ,其中 T i T_{i} Ti​ 又是一棵树,称为根 r o o t root root的子树。 每棵子树的根结点有且仅有一个直接前驱,但有零个或多个直接后继。

基本术语

  1. 结点:包含一个数据元素及若干指向其它结点的分支信息
  2. 结点的度:一个结点的子树个数称为此结点的度。
  3. 叶结点:度为 0 的结点,即无后继的结点,也称为终端结点。
  4. 分支结点:度不为 0 的结点,也称为非终端结点。
    孩子结点:一个结点的直接后继称为该结点的孩子结点。
  5. 双亲结点:一个结点的直接前驱称为该结点的双亲结点。
  6. 兄弟结点:同一双亲结点的孩子结点之间互称兄弟结点。
  7. 祖先结点:一个结点的祖先结点是指从根结点到该结点的路径上的所有结点。
  8. 子孙结点:一个结点的直接后继和间接后继称为该结点的子孙结点。
  9. 树的度: 树中所有结点的度的最大值
  10. 结点的层次:从根结点开始定义,根结点的层次为1,根的直接后继的层次为2,依此类推。
  11. 树的高度(深度): 树中所有结点的层次的最大值。
  12. 有序树:在 树T 中,如果各子树Ti之间是有先后次序的,则称为有序树。
  13. 森林: m ( m ≥ 0 ) m(m \geq0) m(m≥0) 棵互不相交的树的集合。将一棵非空树的根结点删去,树就变成一个森林;反之,给森林增加一个统一的根结点,森林就变成一棵树。

二叉树

定义

我们把满足以下两个条件的树形结构叫做二叉树(Binary Tree):

  1. 每个结点的度都不大于2;
  2. 每个结点的孩子结点次序不能任意颠倒。

二叉树的五种基本形态

二叉树的特殊形式

满二叉树:

深度为 k k k 且有 2 k − 1 2k-1 2k−1 个结点的二叉树。在满二叉树中,每层结点都是满的,即每层结点都具有最大结点数。

完全二叉树:

深度为 k k k ,结点数为 n n n 的二叉树,如果其结点 1 ∼ n 1 \sim n 1∼n 的位置序号分别与满二叉树的结点 1 ∼ n 1 \sim n 1∼n的位置序号一一对应(也就是深度为 1 ∼ k − 1 1 \sim k-1 1∼k−1的所有结点都是满二叉树,第 k k k 层结点全部都靠在左边),则为完全二叉树.

性质

  1. 在二叉树的第 i i i 层上至多有 2 i − 1 2^{i-1} 2i−1 个结点 ( i ≥ 1 ) ( i \geq 1) (i≥1)。
  2. 深度为k的二叉树至多有 2 k − 1 2^{k}-1 2k−1 个结点 ( k ≥ 1 ) (k \geq 1) (k≥1)。
  3. 对任意一棵二叉树 T T T,若终端结点数为 n 0 n_{0} n0​ ,而其度数为 2 的结点数为 n 2 n_{2} n2​,则 n 0 = n 2 + 1 n_{0}=n_{2}+1 n0​=n2​+1。
  4. 具有 n n n 个结点的完全二叉树的深度为 i n t ( l o g 2 n ) + 1 int(log_{2}n)+1 int(log2​n)+1
  5. 对于具有 n n n 个结点的完全二叉树, 如果按照 从上到下 和 从左到右 的顺序对二叉树中的所有结点从 1开始顺序编号, 则对于任意的序号为 i i i 的结点有:
    (1) 如 i = 1 i=1 i=1,则序号为 i i i 的结点是 根结点, 无双亲结点; 如 i > 1 i>1 i>1 , 则序号为 i i i 的结点的双亲结点序号为 i n t ( i / 2 ) int(i/2) int(i/2) 。
    (2) 如 2 × i > n 2 \times i>n 2×i>n,则序号为i的结点无左孩子;如 2 × i ≤ n 2 \times i \leq n 2×i≤n,则序号为i的结点的左孩子结点的序号为 2 × i 2 \times i 2×i 。
    (3) 如 2 × i + 1 > n 2 \times i+1>n 2×i+1>n,则序号为 i i i 的结点无右孩子;如 2 × i + 1 ≤ n 2 \times i+1 \leq n 2×i+1≤n, 则序号为i的结点的右孩子结点的序号为 2 × i + 1 2 \times i+1 2×i+1

存储结构

二叉树的结构是非线性的, 每一结点最多可有两个后继。
二叉树的存储结构有两种: 顺序存储结构和链式存储结构。
1.顺序存储结构


2. 链式存储结构
对于任意的二叉树来说,每个结点最多只有两个孩子,一个双亲结点。我们可以设计每个结点至少包括三个域:数据域、 左孩子域 和 右孩子域.
用C++可以这样声明二叉树的二叉链表结点的结构:

typedef struct Node
{DataType data; struct Node *LChild; struct Node *RChild;
}BiTNode,  *BiTree;

遍历

我们用L、D、R分别表示遍历左子树、访问根结点、 遍历右子树, 那么对二叉树的遍历顺序就可以有六种方式:

  1. 访问根,遍历左子树,遍历右子树(记做DLR)。
  2. 访问根,遍历右子树,遍历左子树(记做DRL)。
  3. 遍历左子树,访问根,遍历右子树(记做LDR)。
  4. 遍历左子树,遍历右子树,访问根(记做LRD)。
  5. 遍历右子树,访问根,遍历左子树(记做RDL)。
  6. 遍历右子树,遍历左子树,访问根(记做RLD)。


先序遍历: A、 B、 D、 F、 G、 C、 E、 H 。
中序遍历: B、 F、 D、 G、 A、 C、 E、 H 。
后序遍历: F、 G、 D、 B、 H、 E、 C、 A 。

例题

  1. 小球(drop)
    设置一个计数器,如果此结点为 f a l s e false false ,将它变为 t r u e true true,访问左子树;如果此结点为 t r u e true true,将他变为 f a l s e false false,访问右子树;最后输出 m m m 次循环后所访问的叶子节点
#include<bits/stdc++.h>
using namespace std;
const int Max = 5242885;
int d, l, last, maxn;
bool vis[Max];
void dfs(int x){if(!vis[x]){vis[x] = 1;if(2 * x > maxn){last = x;return ;}     dfs(2 * x);}else{vis[x] = 0;if(2 * x + 1 > maxn){last = x;return ;} dfs(2 * x + 1);}
}
int main() {scanf("%d %d", &d, &l);maxn = pow(2, d) - 1;while(l--) dfs(1);printf("%d", last);return 0;
}
  1. 扩展二叉树

先用指针变量和线性链表建立一个二叉树,然后用递归分别输出中序序列和后续序列即可。

#include<bits/stdc++.h>
using namespace std;
struct node{char id;int cld[2];
}tree[85];
int root,cnt;
int newnode(char v){cnt++;tree[cnt].id = v;tree[cnt].cld[0] = tree[cnt].cld[1] = 0;return cnt;
}
void build(int &rt){char c;c = getchar();if(c == '.') return;rt = newnode(c);build(tree[rt].cld[0]);build(tree[rt].cld[1]);
}
void inorder(int rt){if(rt == 0) return;inorder(tree[rt].cld[0]);printf("%c", tree[rt].id);inorder(tree[rt].cld[1]);
}
void postorder(int rt){if(rt == 0) return;postorder(tree[rt].cld[0]);postorder(tree[rt].cld[1]);printf("%c", tree[rt].id);
}
int main(){build(root);inorder(root);puts("");postorder(root);return 0;
}

end

进击高手【第十期】树相关推荐

  1. 开发者论坛一周精粹(第二十期) :晒往期云栖大会的照片或感想,赢2017杭州云栖大会门票...

    第二十期(2017年8月21日-2017年8月27日 ) 2017杭州云栖大会即将震撼来袭,如果你参与过往期的云栖大会,不妨晒出你的参会照片和感想,我们将挑选10个优秀的分享送出2017杭州云栖大会的 ...

  2. 花之语第十期:木棉花

    一.初识 广州市市花: 也叫"英雄花",因为它开得红艳但又不媚俗,它的壮硕的躯干,顶天立地的姿态,英雄般的壮观,花瓣的颜色红得犹如壮士的风骨,色彩就像英雄的鲜血染红了树梢: 花期为 ...

  3. 《开源圆桌派》第十期:开源应该野蛮生长,还是开放治理?

    | 编辑:王萱 | 设计:朱亿钦 近年来,各界正在积极拥抱互联网,拥抱开源软件,开源软件的引入和使用迅速发展,引入的种类和应用的广度也迅速增加,开源软件的安全问题亟待进行系统性治理.但对于开源治理的正 ...

  4. 经典算法题每日演练——第十题 树状数组

    原文:经典算法题每日演练--第十题 树状数组 有一种数据结构是神奇的,神秘的,它展现了位运算与数组结合的神奇魅力,太牛逼的,它就是树状数组,这种数据结构不是神人是发现不了的. 一:概序 假如我现在有个 ...

  5. 抢票 | AI未来说学术论坛第十期 视频理解与推荐专场

    AI已来,而你来不来!? 人工智能论坛如今浩如烟海,有硬货.有干货的讲座却百里挑一."AI未来说"青年学术论坛第十期如约而至.来自北京大学.百度的各位专家和青年才俊,共同阐述个性化 ...

  6. 华为云PB级数据库GaussDB(for Redis)揭秘第十期:GaussDB(for Redis)迁移系列(上)

    本文分享自华为云社区<华为云PB级数据库GaussDB(for Redis)揭秘第十期:GaussDB(for Redis)迁移系列(上)>,原文作者:高斯Redis官方博客 . Gaus ...

  7. Csdn视频第二十期 : 测试工具与流程讨论

    Csdn视频第二十期 : 测试工具与流程讨论 http://live.csdn.net/Issue22/LivePlay.aspx

  8. 开视界 创未来丨酷雷曼第十期合作商交流会圆满举办

    第十期合作商交流提升会 3月22日-3月24日,为期三天的第十期酷雷曼合作商交流提升会在酷雷曼北京运营中心--同创蓝天大厦成功举办. 3月22日上午,酷雷曼北京总部人潮涌动,在这里即将举行酷雷曼第十期 ...

  9. 平安科技移动开发二队技术周报(第十期)

    平安科技移动开发二队技术周报(第十期) @author ASCE1885的 Github 简书 微博 CSDN 业界新闻 1)Java版权案谷歌上诉被驳回 甲骨文笑到最后 美国最高法院周一驳回了谷歌( ...

  10. 《从零开始的 RPG 游戏制作教程》第十期:信息反馈(下)

    目录 1. 前言 2. 第一期:制作基础场景 3. 第二期:让勇者和怪物登场 4. 第三期:基础的数值设计 5.第四期:从理论的角度简单聊聊关卡 6.第五期:制作物品和技能 7.第六期:设置怪物掉落物 ...

最新文章

  1. Linked List Cycle II
  2. i love you 浪漫字体复制_2020高考英语全国I、II、III卷语篇来源!欢迎转发交流!...
  3. 【Python】3D Axis
  4. 怎么求导来着?别费劲了,试试这个Python的通用求导法
  5. Mplayer 音频解码分析
  6. xp硬盘上安装ubuntu12.04双系统
  7. ubuntu 14 配置vsftp
  8. java 是怎么跨平台运行的
  9. python数据分析模型选择_python学习-数据分析2(分类型数据处理+SVM建模)
  10. CF1106F Lunar New Year and a Recursive Sequence(矩阵快速幂+bsgs+exgcd)
  11. UE4官方文档UI学习:7. UMG 用事件驱动UI更新
  12. dd命令烧写superboot.bin
  13. 基于Android的家校联系平台开发(论文)
  14. php 数字转人民币,php数字转人民币金额大写
  15. 在DX12中使用imgui 鼠标响应问题的解决
  16. Webdriver 爬取新浪滚动新闻
  17. 重邮2020年硕士研究生入学考试(《数据结构》802)自己做的部分答案
  18. 三星android功能怎么用,三星画中画功能是什么意思?三星手机画中画功能使用教程图解...
  19. 实验6-cp –r系统命令的实现--源路径(目录)中的所有文件和子目录,以及子目录中的所有内容,全部拷贝到目标路径(目录)中--操作系统实验
  20. c语言上机怎么弄一元一次方程,怎么在c语言中编写一元一次方程

热门文章

  1. javascript前端开发最全面试题汇总
  2. VMware ESXi 8.0U1 Unlocker OEM BIOS 集成网卡驱动和 NVMe 驱动 (集成驱动版)
  3. 【搜索算法】深度优先搜索遍历
  4. 微信开发(一)搭建开发环境
  5. 【ISO14229_UDS刷写】-1-$34诊断服务RequestDownload理论部分
  6. 如何让新网站不被(禁止所有)搜索引擎收录 robots.txt 文件设置
  7. mysql到hive数据类型转换
  8. Matlab系列之脚本与函数M文件与函数句柄
  9. android 序列化传参数,android 传值 序列化
  10. 高考:三本,计算机专业的建议