【笔记】树(Tree)

一、树的基本概念

1、树的简介

之前我们都是在谈论一对一的线性数据结构,可现实中也有很多一对多的情况需要处理,所以我们就需要一种能实现一对多的数据结构--“树”。

2、树的定义

树(Tree)是一种非线性的数据结构,它是n(n >= 0)个结点组成的一个具有层次关系的有限集。之所以把它叫做树是因为它看起来像一颗倒挂的树,也就是它的根是朝上,而叶子是朝上的。

在n=0时称为空树。在任意一颗非空树中:

  1. 有且仅有一个特定的称为根(Root)的结点;
  2. 当n>1时,其余结点可分为m(m > 0)个互不相交的有限集T1、T2、...... 、Tm,其中每一个集合本身又是一棵树,并且称为根的子树(SubTree)。

注意:在树型结构中,子树之间不能有交集,否则就不能是树形结构。 如果相交了,那就是图。

3、树的一些基本术语

就拿这张图来举例子

  1. 节点的度:一个节点含有的子树的个数称为该节点的度; 如上图:A的为6
  2. 叶节点或终端节点:度为0的节点称为叶节点; 如上图:B、C、H、I...等节点为叶节点
  3. 非终端节点或分支节点:度不为0的节点; 如上图:D、E、F、G...等节点为分支节点
  4. 双亲节点或父节点:若一个节点含有子节点,则这个节点称为其子节点的父节点; 如上图:A是B的父节点
  5. 孩子节点或子节点:一个节点含有的子树的根节点称为该节点的子节点; 如上图:B是A的孩子节点
  6. 兄弟节点:具有相同父节点的节点互称为兄弟节点; 如上图:B、C是兄弟节点
  7. 树的度:一棵树中,最大的节点的度称为树的度; 如上图:树的度为6
  8. 节点的层次:从根开始定义起,根为第1层,根的子节点为第2层,以此类推;
  9. 树的高度或深度:树中节点的最大层次; 如上图:树的高度为4
  10. 堂兄弟节点:双亲在同一层的节点互为堂兄弟;如上图:H、I互为兄弟节点
  11. 节点的祖先:从根到该节点所经分支上的所有节点;如上图:A是所有节点的祖先
  12. 子孙:以某节点为根的子树中任一节点都称为该节点的子孙。如上图:所有节点都是A的子孙
  13. 森林:由m(m>0)棵互不相交的树的集合称为森林;

二、树的存储结构

提及存储结构,那必然会想到两种常用的存储结构。一个是顺序存储结构,另一个则是链式存储结构。这两个存储结构在我们之前学习其他的数据结构中也学习过。

树结构相对线性表就比较复杂了,要存储表示起来就比较麻烦了,既要保存值域,也要保存结点和结点之间的关系。实际中树有很多种表示方式如:双亲表示法,孩子表示法、孩子双亲表示法以及孩子兄弟表示法等。我们这里就简单的了解双亲表示法,孩子表示法以及孩子兄弟表示法。

1、双亲表示法

我们人可能因为种种原因,没有孩子,但无论是谁都不可能是从石头里蹦出来的(孙悟空除外,它显然不算是人),所以人一定就会有父母。树这种结构也不例外,除了根结点外,其余的每个结点不一定有孩子,但一定有且一个双亲。

#define MAX_TREE_SIZE 100

typedef int TElemType;              //树结点的数据类型,目前暂定为整形

typedef struct PTNode
{
    TElemType data;                //结点数据
    int parent;                    //双亲位置
}PTNode;

typedef struct
{
    PTNode nodes[MAX_TREE_SIZE];    //结点数组    
    int r,n;                        //根的位置和结点数
}

这样的存储结构,我们根据结点的 parent指针很容易找到它的双亲结点,所用的时间复杂度为O(1)。但麻烦的是如果想要知道结点的孩纸是谁,不好意思,请遍历整个结构才行。

2、孩子表示法

把每个结点的孩子结点排列起来,以单链表作为存储结构,则n个结点有n个孩子链表,如果是叶子结点则此单链表为空。然后n个头指针又组成一个线性表,采用顺序存储结构,存放进一个一维数组中。

 

为此,需要设计两种结点结构,一个是孩子链表的孩子结点,如下表所示

其中,child是数据域,用来存储某个结点在表头数组中的下标;next是指针域,用来存储指向某个结点的下一个孩子结点的指针。

另一个是表头数组的表头结点,如下表所示

其中,data是数据域,存储某个结点的数据信息;firstchild是头指针域,存储该结点的孩子链表的头指针。

#define max_TREE_SIZE 100

typedef int TElemType;                //树结点的数据类型,目前暂定为整形

typedef struct CTNode                 //孩子结点
{
    int child;
    struct CTNode* next;    
} *ChildPtr;

typedef strucct                        //表头结构
{
    TElemType data;
    ChildPTr firstchild;
}CTBox;

typedef struct                         //树结构
{
    CTBox nodes[MAX_TREE_SIZE];        //结点数组
    int r,n;                           //结点位置和结点数
}CTree;

 这样的数据结构对于我们要查找某个结点的孩子,或者找某个结点的兄弟,只需要查找这个结点的孩子单链表即可。对于遍历整棵树也是很方便的,对头结点的数组循环即可。

但是如果想知道某个结点的双亲是谁?就需要遍历整棵树。所以就衍生出了将二者合二为一的方法:孩子兄弟表示法。

3、孩子兄弟表示法

typedef int DataType;
struct Node
{
 struct Node* _firstChild1; // 第一个孩子结点
 struct Node* _pNextBrother; // 指向其下一个兄弟结点
 DataType _data; // 结点中的数据域
};

 这种表示法,给查找某个结点的某个孩子带来了方便,只需要通过firstchild找到此结点的长子,然后通过长子结点的nextbrother找到它的二弟,接着一直下去,直到找到具体的孩子。

三、树在实际中的运用(表示文件系统的目录树结构)


以上就是关于树的基本概念和存储结构的知识点。有关二叉树的内容会在下一个章节中再详细描述。

<think>好的,用户想要了解关于SpeedTree的学习笔记。首先,我需要回忆SpeedTree的基本信息,确定它是一个用于生成木、植物等3D模型的软件,广泛应用于游戏、电影和视觉效果行业。用户可能希望从基础开始,逐步掌握其使用技巧。 接下来,用户可能处于学习SpeedTree的初期阶段,需要结构化的学习路径。他们可能对界面不熟悉,或者想了解如何创建不同类型的植被。考虑到用户可能的需求,应该分模块讲解,比如界面介绍、基本操作、生成器类型、参数调整等。 还要注意用户可能的实际应用场景,比如游戏开发或影视制作,不同的场景可能有不同的细节需求。例如,游戏模型需要低多边形(Low Poly)优化,而影视可能需要高细节模型。因此,在笔记中应该提到这些应用差异。 另外,用户可能遇到常见问题,比如资源管理、参数调节困难或与其他软件的兼容性。需要包含一些技巧和注意事项,帮助他们避免常见错误,提高效率。 需要检查是否有遗漏的部分,比如导出设置、插件支持(如Unity、Unreal Engine),以及如何利用SpeedTree的风动画功能。这些对实际项目非常重要,应该涵盖在内。 最后,确保内容结构清晰,分点列出,便于用户逐步学习。同时,语言要简洁明了,避免专业术语过多,必要时举例说明。可能还需要推荐一些学习资源,如官方文档、教程视频,帮助用户进一步学习。</think>以下是一份结构清晰的**SpeedTree学习笔记**整理,适合新手入门和常用功能梳理: --- ### 一、基础概念 1. **SpeedTree用途** 主要用于生成逼真的3D木、植物模型,支持游戏开发(低模优化)、影视特效(高精度渲染)等场景。 - **核心优势**:参数化建模、风动画模拟、LOD(多细节层次)自动生成。 2. **软件界面分区** - **视口区**:3D预览窗口(支持切换透视/正交视图)。 - **节点层级**:控制干、枝、叶的分层结构。 - **属性面板**:调节参数如长度、半径、弯曲度等。 --- ### 二、核心操作流程 1. **创建基础干** - 选择`Generator` → `Trunk`,通过`Length`(长度)、`Radius`(半径)调整主干形态。 - 使用`Spine`曲线编辑器微调弯曲效果。 2. **添加分支与细节** - **一级分支**:在干节点下添加`Branch`生成器,设置`Frequency`(密度)、`Angle`(生长角度)。 - **次级分支**:通过嵌套生成器实现复杂结构(例:主分支→子分支→叶)。 3. **叶生成技巧** - 使用`Frond`生成片状叶,或`Leaf Mesh`导入自定义模型。 - 调整`Cluster`参数控制叶聚簇效果。 --- ### 三、关键参数解析 1. **生长控制参数** - `Gravity`:模拟重力下垂效果。 - `Flex`:设置柔韧性,影响风吹动时的摆动幅度。 - `Noise`:添加随机噪波,打破规律性。 2. **风动画设置** - 启用`Wind Effects`,调节`Speed`(风速)、`Direction`(风向)。 - 分层控制:干/枝/叶可分别设置不同的风响应强度。 --- ### 四、优化与导出 1. **LOD优化** - 自动生成多级LOD:通过`LOD Properties`设置面数递减规则。 - 手动调整:删除不可见的面或合并细节。 2. **导出格式** - **游戏引擎**:导出为`.FBX`(带LOD和风动画),兼容Unity/Unreal。 - **影视渲染**:导出`.ABC`(Alembic格式)保留高精度动态细节。 --- ### 五、常见问题解决 1. **模型穿模** - 检查分支`Collision`设置,或手动调整分支生长角度。 2. **资源过大** - 使用`Texture Atlas`合并叶贴图,减少Draw Call。 3. **导入引擎后材质丢失** - 确保导出时勾选`Embed Textures`,或在引擎中重新指定贴图路径。 --- ### 六、学习资源推荐 1. **官方文档**:[SpeedTree Documentation](https://docs.speedtree.com) 2. **教程视频**:YouTube频道“SpeedTree Official”提供从基础到进阶的案例演示。 3. **社区论坛**:SpeedTree Forum中可下载免费植物模型库。 --- 通过分阶段练习(从单棵到复杂植被群),结合参数调节与实操项目,可快速掌握SpeedTree的核心工作流。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Peace & Love487

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值