解释如下:

1、此结构是将二叉树的所有结点,按照一定的次序,存储到一片连续的存储单元中。

2、必须将结点排成一个适当的线性序列,使得结点在这个序列中的相应位置能反映出结点之间的逻辑关系。这种结构特别适用于近似满二叉树。

3、在一棵具有n个结点的近似满二叉树中,我们从树根起,自上层到下层,逐层从左到右给所有结点编号,就能得到一个足以反映整个二叉树结构的线性序列。

数据结构中树与二叉树的区别在于?

二叉树是指一个树的父节点最多只有两个子节点构成的树,树是不限制子节点的个数的。

二叉树是树的一种特例,是树的子集。

三个节点是无法表示出二叉树和树的区别的,需要三个以上的节点。

二叉树的表示如下图。

树的表示如下图。

扩展资料:

树图是一种数据结构,由n (n>=1)个有限节点组成具有层次关系的集合。它被称为树是因为它看起来像一棵倒立的树,意思是它的根是向上的,叶子是向下的。它具有以下特点:

每个节点有零个或多个子节点;没有父节点的节点称为根节点;每个非根节点都有且只有一个父节点;除了根之外,每个子树还可以分为多个不相交的子树。

相关术语

节点的度:节点中包含的子树数称为节点的度;

叶节点或终端节点:度为0的节点称为叶节点;

非终端节点或分支节点:度不为0的节点;

父节点或父节点:如果一个节点包含子节点,该节点称为子节点的父节点;

子节点或子节点:一个节点包含的子树的根节点称为该节点的子节点;

同级节点:具有相同父节点的节点称为同级节点。

树度:在树中,最大节点的度称为树的度;

节点层次结构:从根开始,根是第一层,根的子节点是第二层,依此类推。

树的高度或深度:树中节点的最大级别;

表亲节点:父节点在同一层的节点是彼此的表亲;

节点的祖先:从根节点到该节点所经过的分支的所有节点;

子代:根于某一节点的子树中的任何节点称为该节点的子代。

森林:以m (m>=0)相交的树的集合称为森林;

参考资料:

百度百科-树(数据结构)

大话数据结构的作品目录

该二叉树为:

            A

       /        \

   B             G

 /   \              \

C      D              H

    /     \

   E      F

顺序结构

A  B  G   C  D   空   H   空  空  E   F

后序遍历: CEFDBHGA

几种二叉树的定义

第1章数据结构绪论 1

11开场白 2

如果你交给某人一个程序,你将折磨他一整天;如果你教某人如何编写程序,你将折磨他一辈子。

12你数据结构怎么学的? 3

他完成开发并测试通过后,得意地提交了代码。项目经理看完代码后拍着桌子对他说:“你数据结构是怎么学的?”

13数据结构起源 4

14基本概念和术语 5

正所谓“巧妇难为无米之炊”,再强大的计算机,也要有“米”下锅才可以干活,否则就是一堆破铜烂铁。这个“米”就是数据。

141数据 5

142数据元素 5

143数据项 6

144数据对象 6

145数据结构 6

15逻辑结构与物理结构 7

151逻辑结构 7

152物理结构 9

16抽象数据类型 11

大家都需要房子住,但显然没钱考虑大房子是没有意义的。于是商品房就出现了各种各样的户型,有几百平米的别墅,也有仅两平米的胶囊公寓……

161数据类型 11

162抽象数据类型 12

17总结回顾 14

18结尾语 15

最终的结果一定是,你对着别人很牛的说“数据结构——就那么回事。”

第2章算法 17

21开场白 18

22数据结构与算法关系 18

计算机界的前辈们,是一帮很牛很牛的人,他们使得很多看似没法解决或者很难解决的问题,变得如此美妙和神奇。

23两种算法的比较 19

高斯在上小学的一天,老师要求每个学生都计算1+2+…+100的结果,谁先算出来谁先回家……

24算法定义 20

现实世界中的算法千变万化,没有通用算法可以解决所有问题。甚至一个小问题,某个解决此类问题很优秀的算法却未必就适合它。

25算法的特性 21

251输入输出 21

252有穷性 21

253确定性 21

254可行性 21

26算法设计的要求 22

求100个人的高考成绩平均分与求全省所有考生的成绩平均分在占用时间和内存存储上有非常大的差异,我们自然追求高效率和低存储的算法来解决问题。

261正确性 22

262可读性 23

263健壮性 23

264时间效率高和存储量低 23

27算法效率的度量方法 24

随着n值越来越大,它们在时间效率上的差异也就越来越大。好比有些人每天都在学习,而另一些人,打打游戏、睡睡大觉,毕业后前者名企争着要,后者求职处处无门。

271事后统计方法 24

272事前分析估算方法 25

28函数的渐近增长 27

29算法时间复杂度 29

理解大o推导不算难,难的其实是对数列的一些相关运算,这考察的更多的是数学知识和能力。

291算法时间复杂度定义 29

292推导大o阶方法 30

293常数阶 30

294线性阶 31

295对数阶 32

296平方阶 32

210常见的时间复杂度 35

有些时候,告诉你某些东西不可以去尝试,也是一种知识的传递。总不能非要去被毒蛇咬一口才知道蛇不可以去招惹吧。

211最坏情况与平均情况 35

212算法空间复杂度 36

事先建立一个有2050大的数组,然后把所有年份按下标数字对应,如果是闰年,此数组项的值就是1,如果不是就是0。这样,所谓的判断某一年是否是闰年就变成了查找这个数组的某一项的值是多少的问题。

213总结回顾 37

214结尾语 38

愚公移山固然可敬,但发明炸药和推土机,可能更加实在和聪明。

第3章线性表 41

31开场白 42

门外家长都挤在大门口与门里的小孩子的井然有序,形成了鲜明对比。哎,有时大人的所作所为,其实还不如孩子。

32线性表的定义 42

33线性表的抽象数据类型 45

有时我们想知道某个小朋友(比如麦兜)是否是班级的同学,老师会告诉我说,没有,麦兜是在春田花花幼儿园里。这种查找某个元素是否存在的操作很常用。

34线性表的顺序存储结构 47

他每次一吃完早饭就冲着去了图书馆,挑一个好地儿,把他书包里的书,一本一本的按座位放好,长长一排,九个座硬是被他占了。

341顺序存储定义 47

342顺序存储方式 47

343数据长度与线性表长度区别 48

344地址计算方法 49

35顺序存储结构的插入与删除 50

春运时去买火车票,大家都排队排着好好的,这时来了一个美女:“可否让我排在你前面?”这可不得了,后面的人像蠕虫一样,全部都得退后一步。

351获得元素操作 50

352插入操作 51

353删除操作 52

354线性表顺序存储结构的优缺点 54

36线性表的链式存储结构 55

反正也是要让相邻元素间留有足够余地,那干脆所有元素都不要考虑相邻位置了,哪有空位就到哪里。而只是让每个元素知道它下一个元素的位置在哪里。

361顺序存储结构不足的解决

办法 55

362线性表链式存储结构定义 56

363头指针与头结点的异同 58

364线性表链式存储结构代码描述 58

37单链表的读取 60

38单链表的插入与删除 61

本来是爸爸左牵着妈妈的手、右牵着宝宝的手在马路边散步。突然迎面走来一美女,爸爸失神般地望着,此情景被妈妈逮个正着,于是扯开父子俩,拉起宝宝的左手就快步朝前走去。

381单链表的插入 61

382单链表的删除 64

39单链表的整表创建 66

310单链表的整表删除 69

311单链表结构与顺序存储结构优缺点 70

312静态链表 71

对于一些语言,如basic、fortran等早期的编程高级语言,由于没有指针,这链表结构,按照前面我们的讲法,它就没法实现了。怎么办呢?

3121静态链表的插入操作 73

3122静态链表的删除操作 75

3123静态链表优缺点 77

313循环链表 78

这个轮回的思想很有意思。它强调了不管你今生是穷是富,如果持续行善积德,下辈子就会好过,反之就会遭到报应。

314双向链表 81

就像每个人的人生一样,欲收获就得付代价。双向链表既然是比单链表多了如可以反向遍历查找等的数据结构,那么也就需要付出一些小的代价。

315总结回顾 84

316结尾语 85

如果你觉得上学读书是受罪,假设你可以活到80岁,其实你最多也就吃了20年苦。用人生四分之一的时间来换取其余时间的幸福生活,这点苦不算啥。

第4章栈与队列 87

41开场白 88

想想看,在你准备用枪的时候,突然这手枪明明有子弹却打不出来,这不是要命吗。

42栈的定义 89

类似的很多软件,比如word、photoshop等,都有撤消(undo)的操作,也是用栈这种思想方式来实现的。

421栈的定义 89

422进栈出栈变化形式 90

43栈的抽象数据类型 91

44栈的顺序存储结构及实现 92

441栈的顺序存储结构 92

442栈的顺序存储结构进栈操作 93

443栈的顺序存储结构出栈操作 94

45两栈共享空间 94

两个大学室友毕业同时到北京工作,他们都希望租房时能找到独自住的一室户或一室一厅,可找来找去发现,实在是承受不起。

46栈的链式存储结构及实现 97

461栈的链式存储结构 97

462栈的链式存储结构进栈操作 98

463栈的链式存储结构出栈操作 99

47栈的作用 100

48栈的应用——递归 100

当你往镜子前面一站,镜子里面就有一个你的像。但你试过两面镜子一起照吗?如果a、b两面镜子相互面对面放着,你往中间一站,嘿,两面镜子里都有你的千百个“化身”。

481斐波那契数列实现 101

482递归定义 103

49栈的应用——四则运算表达式求值 104

491后缀(逆波兰)表示法定义 104

492后缀表达式计算结果 106

493中缀表达式转后缀表达式 108

410队列的定义 111

电脑有时会处于疑似死机的状态。就当你失去耐心,打算了reset时。突然它像酒醒了一样,把你刚才点击的所有操作全部都按顺序执行了一遍。

411队列的抽象数据类型 112

412循环队列 113

你上了公交车发现前排有两个空座位,而后排所有座位都已经坐满,你会怎么做?立马下车,并对自己说,后面没座了,我等下一辆?没这么笨的人,前面有座位,当然也是可以坐的。

4121队列顺序存储的不足 112

4122循环队列定义 114

413队列的链式存储结构及实现 117

4131队列链式存储结构入队操作118

4132队列链式存储结构出队操作 119

414总结回顾 120

415结尾语 121

人生,需要有队列精神的体现。南极到北极,不过是南纬90度到北纬90度的队列,如果你中途犹豫,临时转向,也许你就只能和企鹅相伴永远。可事实上,无论哪个方向,只要你坚持到底,你都可以到达终点。

第5章串 123

51开场白 124

“枯眼望遥山隔水,往来曾见几心知?壶空怕酌一杯酒,笔下难成和韵诗。途路阻人离别久,讯音无雁寄回迟。孤灯夜守长寥寂,夫忆妻兮父忆儿。”……可再仔细一读发现,这首诗竟然可以倒过来读。

52串的定义 124

我所提到的“over”、“end”、“lie”其实就是“lover”、“friend”、“believe”这些单词字符串的子串。

53串的比较 126

54串的抽象数据类型 127

55串的存储结构 128

感情上发生了问题,为了向女友解释一下,我准备发一条短信,一共打了75个字。最后八个字是“我恨你是不可能的”,点发送。后来得知对方收到的,只有70个字,短信结尾是“……我恨你”。

551串的顺序存储结构 129

552串的链式存储结构 131

56朴素的模式匹配算法 131

主串为s=”00000000000000000000000000000000000000000000000001”,而要匹配的子串为t=”0000000001”,……在匹配时,每次都得将t中字符循环到最后一位才发现,哦,原来它们是不匹配的。

57kmp模式匹配算法 135

很多年前我们的科学家觉得像这种有多个0和1重复字符的字符串,却需要挨个遍历的算法,是非常糟糕的事情。

571kmp模式匹配算法原理 135

572next数组值推导 139

573kmp模式匹配算法实现 141

574kmp模式匹配算法改进 142

575nextval数组值推导 144

58总结回顾 146

59结尾语 146

《璇玑图》共八百四十字,纵横各二十九字,纵、横、斜、交互、正、反读或退一字、迭一字读均可成诗,诗有三、四、五、六、七言不等,目前有人统计可组成七千九百五十八首诗。听清楚哦,是7958首。

第6章树 149

61开场白 150

无论多高多大的树,那也是从小到大的,由根到叶,一点点成长起来的。俗话说十年树木,百年树人,可一棵大树又何止是十年这样容易。

62树的定义 150

树的定义其实就是我们在讲解栈时提到的递归的方法。也就是在树的定义之中还用到了树的概念,这是比较新的一种定义方法。

621结点分类 152

622结点间关系 152

623树的其他相关概念 153

63树的抽象数据类型 154

64树的存储结构 155

641双亲表示法 155

642孩子表示法 158

643孩子兄弟表示法 162

65二叉树的定义 163

苏东坡曾说:“人有悲欢离合,月有阴晴圆缺,此事古难全”。意思就是完美是理想,不完美才是人生。我们通常举的例子也都是左高右低、参差不齐的二叉树。那是否存在完美的二叉树呢?

651二叉树特点 164

652特殊二叉树 166

66二叉树的性质 169

661二叉树性质1 169

662二叉树性质2 169

663二叉树性质3 169

664二叉树性质4 170

665二叉树性质5 171

67二叉树的存储结构 172

671二叉树顺序存储结构 172

672二叉链表 173

68遍历二叉树 174

你人生的道路上,高考填志愿要面临哪个城市、哪所大学、具体专业等选择,由于选择方式的不同,遍历的次序就完全不同。

681二叉树遍历原理 174

682二叉树遍历方法 175

683前序遍历算法 178

684中序遍历算法 181

685后序遍历算法 184

686推导遍历结果 184

69二叉树的建立 187

610线索二叉树 188

我们现在提倡节约型社会,一切都应该节约为本。对待我们的程序当然也不例外,能不浪费的时间或空间,都应该考虑节省。

6101线索二叉树原理 188

6102线索二叉树结构实现 191

611树、森林与二叉树的转换 195

有个乡镇企业也买了同样的生产线,老板发现这个问题后找了个小工来说:你必须搞定,不然炒你鱿鱼。小工很快想出了办法:他在生产线旁边放了台风扇猛吹,空皂盒自然会被吹走。

6111树转换为二叉树 196

6112森林转换为二叉树 197

6113二叉树转换为树 197

6114二叉树转换为森林 199

6115树与森林的遍历 199

612赫夫曼树及其应用 200

压缩而不出错是如何做到的呢?简单的说,就是把我们要压缩的文本进行重新编码,以达到减少不必要的空间的技术。压缩和解压缩技术就是基于赫夫曼的研究之上发展而来,我们应该记住他。

6121赫夫曼树 200

6122赫夫曼树定义与原理 203

6123赫夫曼编码 205

613总结回顾 208

614结尾语 209

人受伤时会流下泪水。树受伤时,天将再不会哭。希望我们的未来不要仅仅是钢筋水泥建造的高楼,也要有那郁郁葱葱的森林和草地,我们人类才可能与自然和谐共处。

第7章图 211

71开场白 212

如果你不善于规划,很有可能就会出现如玩好新疆后到海南,然后再冲向黑龙江这样的荒唐决策。

72图的定义 213

现实中,人与人之间关系就非常复杂,比如我的认识的朋友,可能他们之间也互相认识,这就不是简单的一对一、一对多的关系了,那就是我们今天要研究的主题——图。

721各种图定义 214

722图的顶点与边间关系 217

723连通图相关术语 219

724图的定义与术语总结 222

73图的抽象数据类型 222

74图的存储结构 223

因为美国的黑夜就是中国的白天,利用互联网,他的员工白天上班就可以监控到美国仓库夜间的实际情况,如果发生了像火灾、偷盗这样的突发事件,及时电话到美国当地相关人员处理

741邻接矩阵 224

742邻接表 228

743十字链表 232

744邻接多重表 234

745边集数组 236

75图的遍历 237

我有一天早晨准备出门,发现钥匙不见了。一定是我儿子拿着玩,不知道丢到哪个犄角旮旯去了,你们说,我应该如何找?

751深度优先遍历 238

752广度优先遍历 242

76最小生成树 245

如果你加班加点,没日没夜设计出的结果是方案一,我想你离被炒鱿鱼应该是不远了(同学微笑)。因为这个方案比后两个方案一半还多的成本会让老板气晕过去的。

761普里姆(prim)算法 247

762克鲁斯卡尔(kruskal)算法 251

77最短路径 257

有人为了省钱,需路程最短,但换乘站间距离长等原因并不省时间;另一些人,他为赶时间,最大的需求是总时间要短;还有一类人,他们都不想多走路,关键是换乘要少,这样可以在车上好好休息一下。

771迪杰斯特拉(dijkstra)算法 259

773弗洛伊德(floyd)算法 265

78拓扑排序 270

制作不可能在人员到位进驻场地时,导演还没有找到,也不可能在拍摄过程中,场地都没有。这都会导致荒谬的结果。

781拓扑排序介绍 271

782拓扑排序算法 272

79关键路径 277

假如造一个轮子要05天、造一个发动机要3天、造一个车底盘要2天、造一个外壳要2天,其它零部件2天,全部零部件集中到一处要05天,组装成车要2天,请问,在汽车厂造一辆车,最短需要多少天呢?

791关键路径算法原理 279

792关键路径算法 280

710总结回顾 287

711结尾语 289

世界上最遥远的距离,不是牛a与牛c之间狭小空隙,而是你们当中,有人在通往牛逼的路上一路狂奔,而有人步入大学校园就学会放弃。

第8章查找 291

81开场白 292

当你精心写了一篇博文或者上传一组照片到互联网上,来自世界各地的无数“蜘蛛”便会蜂拥而至。所谓蜘蛛就是搜索引擎公司服务器上软件,它把互联网当成了蜘蛛网,没日没夜的访问上面的各种信息。

82查找概论 293

比如网络时代的新名词,如“蜗居”、“蚁族”等,如果需要将它们收录到汉语词典中,显然收录时就需要查找它们是否存在,以及找到如果不存在时应该收录的位置。

83顺序表查找 295

831顺序表查找算法 296

832顺序表查找优化 297

84有序表查找 298

我在纸上已经写好了一个100以内的正整数请你猜,问几次可以猜出来。当时已经介绍了如何才可以最快的猜出这个数字。我们把这种每次取中间记录查找的方法叫做折半查找。

841折半查找 298

842插值查找 301

843斐波那契查找 302

85线性索引查找 306

我母亲年纪大了,经常在家里找不到东西,于是她用一小本子,记录了家里所有小东西放置的位置,比如户口本放在右手床头柜下面抽屉中,钞票放在衣……咳,这个就不提了。

851稠密索引 307

852分块索引 308

853倒排索引 311

86二叉排序树 313

后来老虎来了,一人拼命地跑,另一人则急中生智,爬到了树上。而老虎是不会爬树的,结果……。爬树者改变了跑的思想,这一改变何等重要,捡回了自己的一条命。

861二叉排序树查找操作 316

862二叉排序树插入操作 318

863二叉排序树删除操作 320

864二叉排序树总结 327

87平衡二叉树(avl树) 328

平板就是一个世界,当诱惑降临,人心中的平衡被打破,世界就会混乱,最后留下的只有孤独寂寞失败。这种单调的机械化的社会,禁不住诱惑的侵蚀,最容易被侵蚀的,恰恰是最空虚的心灵。

871平衡二叉树实现原理 330

872平衡二叉树实现算法 334

88多路查找树(b树) 341

要观察一个公司是否严谨,看他们如何开会就知道了。如果开会时每一个人都只是带一张嘴,即兴发言,这肯定是一家不严谨的公司。

8812-3树 343

8822-3-4树 348

883b树 349

884b+树 351

89散列表查找(哈希表)概述 353

你很想学太极拳,听说学校有个叫张三丰的人打得特别好,于是到学校学生处找人,工作人员拿出学生名单,最终告诉你,学校没这个人,并说张三丰几百年前就已经在武当山作古了。

891散列表查找定义 354

892散列表查找步骤 355

810散列函数的构造方法 356

8101直接定址法 357

8102数字分析法 358

8103平方取中法 359

8104折叠法 359

8105除留余数法 359

8106随机数法 360

811处理散列冲突的方法 360

我们每个人都希望身体健康,虽然疾病可以预防,但不可避免,没有任何人可以说,生下来到现在没有生过一次病。

8111开放定址法 361

8112再散列函数法 363

8113链地址法 363

8114公共溢出区法 364

812散列表查找实现 365

8121散列表查找算法实现 365

8122散列表查找性能分析 367

813总结回顾 368

814结尾语 369

如果我是个喜欢汽车的人,时常搜汽车信息。那么当我在搜索框中输入“甲壳虫”、“美洲虎”等关键词时,不要让动物和人物成为搜索的头条。

第9章排序 373

91开场白 374

假如我想买一台iphone4的手机,于是上了某电子商务网站去搜索。可搜索后发现,有8863个相关的物品,如此之多,这叫我如何选择。我其实是想买便宜一点的,但是又怕遇到骗子,想找信誉好的商家,如何做?

92排序的基本概念与分类 375

比如我们某些大学为了选拔在主科上更优秀的学生,要求对所有学生的所有科目总分倒序排名,并且在同样总分的情况下将语数外总分做倒序排名。这就是对总分和语数外总分两个次关键字的组合排序。

921排序的稳定性 376

922内排序与外排序 377

923排序用到的结构与函数 378

93冒泡排序 378

无论你学习哪种编程语言,在学到循环和数组时,通常都会介绍一种排序算法,而这个算法一般就是冒泡排序。并不是它的名称很好听,而是说这个算法的思路最简单,最容易理解。

931最简单排序实现 379

932冒泡排序算法 380

933冒泡排序优化 382

934冒泡排序复杂度分析 383

94简单选择排序 384

还有一种做股票的人,他们很少出手,只是在不断观察和判断,等时机一到,果断买进或卖出。他们因为冷静和沉着,以及交易的次数少,而最终收益颇丰。

941简单选择排序算法 384

942简单选择排序复杂度分析 385

95直接插入排序 386

哪怕你是第一次玩扑克牌,只要认识这些数字,理牌的方法都是不用教的。将3和4移动到5的左侧,再将2移动到最左侧,顺序就算是理好了。这里,我们的理牌方法,就是直接插入排序法。

951直接插入排序算法 386

952直接插入排序复杂度分析 388

96希尔排序 389

不管怎么说,希尔排序算法的发明,使得我们终于突破了慢速排序的时代(超越了时间复杂度为o(n2)),之后,更为高效的排序算法也就相继出现了。

961希尔排序原理 391

962希尔排序算法 391

963希尔排序复杂度分析 395

97堆排序 396

什么叫堆结构呢?回忆一下我们小时候,特别是男同学,基本都玩过叠罗汉的恶作剧。通常都是先把某个要整的人按倒在地,然后大家就一拥而上扑了上去……后果?后果当然就是一笑了之。

971堆排序算法 398

972堆排序复杂度分析 405

98归并排序 406

即使你是你们班级第一、甚至年级第一名,如果你没有上分数线,则说明你的成绩排不到全省前1万名,你也就基本失去了当年上本科的机会了。

981归并排序算法 407

982归并排序复杂度分析 413

983非递归实现归并排序 413

99快速排序 417

终于我们的高手要登场了,将来你工作后,你的老板让你写个排序算法,而你会的算法中竟然没有快速排序,我想你还是不要声张,偷偷去把快速排序算法找来敲进电脑,这样至少你不至于被大伙儿取笑。

991快速排序算法 417

992快速排序复杂度分析 421

993快速排序优化 422

910总结回顾 428

目前还没有十全十美的排序算法,有优点就会有缺点,即使是快速排序法,也只是在整体性能上优越,它也存在排序不稳定、需要大量辅助空间、对少量数据排序无优势等不足。

911结尾语 430

如果你有梦想的话,就要去捍卫它。当别人做不到的时候,他们就想要告诉你,你也不能。如果你想要些什么,就得去努力争取。就这样!

附录参考文献 435

二叉树(Binary tree)是树形结构的一个重要类型。许多实际问题抽象出来的数据结构往往是二叉树形式,即使是一般的树也能简单地转换为二叉树,而且二叉树的存储结构及其算法都较为简单,因此二叉树显得特别重要。二叉树特点是每个节点最多只能有两棵子树,且有左右之分   。

二叉树是n个有限元素的集合,该集合或者为空、或者由一个称为根(root)的元素及两个不相交的、被分别称为左子树和右子树的二叉树组成,是有序树。当集合为空时,称该二叉树为空二叉树。在二叉树中,一个元素也称作一个节点

二叉树(binary tree)是指树中节点的度不大于2的有序树,它是一种最简单且最重要的树。二叉树的递归定义为:二叉树是一棵空树,或者是一棵由一个根节点和两棵互不相交的,分别称作根的左子树和右子树组成的非空树;左子树和右子树又同样都是二叉树