树
树是n个结点的有限集。n=0时称为空树。在任意一颗非空树中:(1)有且仅有一个特定的称为根的结点;(2)当n>1时,其余结点可分为m(m>0)个互不相交的有限集T1,T2…..Tm,其中每一个集合本身又是一棵树,并且称为根的子树。如下图
-
结点: 树的结点包含一个数据元素及若干指向其子树的分支。
-
结点的度:结点拥有的子树数称为结点的度。
-
叶结点:度为0的结点称为叶结点或终端结点。
-
分支节点:度不为0的结点称为非终端结点或分支结点。除根节点之外,分支结点也称为内部结点。
-
树的度:树中各结点度的最大值。如下图,结点度的最大值是D的度,所以树的度也为3
-
孩子结点:结点的直接后继称为该结点的孩子结点。
-
双亲结点:一个结点的直接前驱称为该结点的双亲结点。
-
兄弟结点:同一双亲结点的孩子结点之间互称兄弟结点。
-
祖先结点:结点的祖先结点是指从根结点到该结点路径上的所有结点。
-
子孙结点:一个结点的直接后继和间接后继称为该结点的子孙结点。
-
结点的层次:从根结点开始定义,根结点的层次为1,根的直接后继层次为2,以此类推。
-
堂兄弟结点:父亲是兄弟关系或堂兄关系的结点称为堂兄弟结点。
-
树的高度(深度):树中结点的最大层次称为树的高度或者深度。
-
有序树:如果将树中结点的各子树看成从左到右是有次序的,不能互换的,则称该树为有序树,否则称为无序树。
-
森林:m颗互不相交的树的集合称为森林。将一棵非空树的根结点删去,树就变成森林;反之,给森林增加一个统一的根结点,森林就变成一棵树。
树的存储结构
说到存储结构,就很自然的想到我们前面讲过的顺序存储和链式存储两种结构。树是一种一对多的结构,那么如何存储能表示结点之间的关系呢?
树的主要存储方法有三种:
双亲表示法
这种方法用一组连续的空间存储树的结点,同时在每个结点中,附设一个指示器指示其双亲结点在表中的位置,也就是说每个结点除了保存自己的数据,还知道其双亲的位置。
由于根结点是没有双亲的,所以我们默认设置根结点的的双亲位置设置为-1.
这种存储方式,利用了树中每个结点(根结点除外)只有一个双亲结点的性质,如果查找结点的双亲结点,时间复杂度仅为O(1),很容易找到根结点,但是如果要找某个结点的孩子结点就需要遍历整个结构才行。
孩子表示法
这种方法通常是把每个结点的孩子结点排列起来,构成一个单链表,称为孩子链表。n个结点共有n个孩子链表(叶子结点的孩子链表为空表),而n个结点的数据和n个孩子链表的头指针组成一个顺序表。
孩子链表中的结点结构,child为该结点在数组中的下标,next指向下一个孩子结点。
数组中的结点结构,data为数据,firstchild指向孩子链表的第一个结点
这样的结构对于我们要查找某个结点的孩子或者兄弟比较方便,只需要查找该结点的孩子链表即可,可是如果要查找某个结点的父亲,那就比较麻烦,需要遍历整个结构。那么我们可不可以把双亲表示法和孩子表示法结合一下呢?当然可以
孩子兄弟表示法
这种方法是每个结点设置两个指针域,指向该结点的第一个孩子结点和右兄弟结点,这种表示法又被称为树的二叉表示法,或者二叉链表表示法。
这种存储结构便于实现树的各种操作,当然要想找到某个结点的双亲也是有一定的缺陷,不过我们完全可以添加一个parent指针来解决这个问题。
二叉树
二叉树是一种简单而重要的树结构,任何树都可以转化为二叉树进行处理,二叉树非常适合计算机处理。
二叉树是n个结点的有限集合,该集合为空时被称为空二叉树,二叉树每个结点的度数都不能大于2,每个结点的孩子结点次序不能任意颠倒。
二叉树每个结点最多有两棵子树,没有子树或者一棵都可以,左子树和右子树是有顺序的,次序不能任意颠倒,即使树中某结点只有一棵子树,也要区分左右。
特殊二叉树
-
斜树:所有的结点都只有右子树的二叉树被称为右斜树,所有的结点都只有左子树的二叉树称为左斜树。两者统称为斜树。
-
满二叉树:一颗二叉树中,如果所有分支结点都存在左子树和右子树,并且所有叶子结点都在同一层上,这样的二叉树称为满二叉树。 满二叉树的顺序表示,从二叉树的根开始,从上到下从左到右从1顺序编号。
- 完全二叉树:对一棵具有n个结点的二叉树编号,如果编号为i的结点和同样深度的满二叉树中编号为i的结点在二叉树中位置完全相同,则称为完全二叉树。满二叉树肯定为完全二叉树,完全二叉树不一定是满二叉树。
二叉树的性质
-
性质一:在二叉树的第i层上最多有2^(i-1)个结点(i >=1)
-
性质二:深度为k的二叉树至多有2^k-1个结点(k>=1)
-
性质三:对任意一棵二叉树T,若终端结点数为n0,而其度数为2的结点数为n2,则n0=n2+1.终端结点数其实就是叶子结点数
-
性质四:具有n个结点的完全二叉树的深度为[log2n]+1([x]符号表示不大于x的最大整数)
-
性质五: 对于具有n个结点的完全二叉树,如果按照从上到下从左到右的顺序对二叉树中的所有结点从1开始进行顺序编号,则对于任意的序号为i的结点有:
(1)如i=1,则序号为i的结点是根结点,无双亲结点;如i>1,则序号为i的结点的双亲结点为 [i/2]
(2)如2i>n,则序号为i的结点无左孩子;如2i<=n,则序号为i的结点的左孩子结点的序号为2i。
(3)如2i+1>n,则序号为i的结点无右孩子;如2i+1<=n,则序号为i的结点的右孩子结点的序号为2i+1.
这几个公式证明还是蛮简单的,如果有兴趣可以参考百度证明一下。
二叉树的顺序存储结构
二叉树的顺序存储结构就是用数组来存储二叉树中的结点,并且数组的下标要体现结点之间的存储关系。
这种存储方式对完全二叉树而言是非常方便的,因为完全二叉树的定义比较严格,我们来看一下。
但是如果是一般的二叉树呢?
如果是一般的二叉树,我们需要将不存在的结点设置为”^”,将其补成一颗完全二叉树来看待。如下图:颜色浅的是不存在的。
顺序结构对一般的二叉树而言,空间浪费太大,所以一般只用于完全二叉树。
二叉树的链式存储结构
对于任意二叉树来说,每个结点最多有两个孩子,所以结点的结构应该设计数据域、左孩子域、右孩子域。
如果有需要,可以增加一个parent域,指向该结点的双亲,这种结构就称为二叉树的三叉链表存储结构。
二叉树的遍历
二叉树的遍历是指按照某种规律对二叉树中的每个结点进行访问且仅访问一次。访问可指计算二叉树中的数据信息,打印该结点信息,包括对结点进行任何其他操作。
二叉树遍历方式:
先序遍历
规则是若二叉树为空,则空操作返回。否则先访问根节点,然后先序遍历左子树,再先序遍历右子树。如下图:遍历顺序为ABDGHCEIF
中序遍历
规则是若二叉树为空,则空操作返回。否则先中序遍历根节点的左子树,然后访问根节点,然后中序遍历右子树。如下图,遍历顺序为GDHBAEICF
后序遍历
规则是若二叉树为空,则空操作返回。否则后序遍历左子树,然后后续遍历右子树,然后访问根节点。如下图,遍历顺序为GHDBIEFCA
层序遍历
规则是若二叉树为空,则空操作返回。否则从树的第一层,即根节点开始,从上到下从左到右逐层遍历。如下图,遍历顺序为:ABCDEFGHI
二叉树的遍历算法
二叉树的遍历操作可以采用递归的方式来运行,极其简洁。
先序遍历算法
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
中序遍历算法
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
后序遍历算法
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
递归遍历算法的时间复杂度分析:设二叉树有n个结点,对每个结点都要执行访问和后退操作,对结点的访问为n次,所以时间复杂度为O(n)。
基于栈的递归消除,我们可以不用递归的方式进行遍历
先序遍历二叉树的非递归算法
非递归算法需要设置一个堆栈,保留当前结点指针,然后根据先序遍历规则进行访问。
具体看代码,一目了然。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
中序遍历二叉树的非递归算法
中序和先序都差不多,只不过位置需要变化一下。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
后序遍历二叉树的非递归算法
后序遍历的非递归算法比较复杂,因为后序遍历要求左、右子树都访问完后,再访问根结点,那么如何判断左、右子树都已经访问过了呢?解决方法有很多种。这里我们采用的是判断刚访问过的结点是不是当前栈顶结点的右孩子。
有三种情况
- 1
- 2
- 3
- 4
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
由遍历序列确定二叉树
有这样一个问题,已知一棵二叉树的先序遍历序列为ABCDEF,中序遍历序列为CBAEDF,那么这棵二叉树的后序遍历结果是什么?
- 1
- 2
- 3
- 4
- 5
- 6
只有一种遍历序列是无法确定二叉树的,至少需要两种遍历序列。
- 1
- 2
- 3
- 4
二叉树的实现
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
- 100
- 101
- 102
- 103
- 104
- 105
- 106
- 107
- 108
- 109
- 110
- 111
- 112
- 113
- 114
- 115
- 116
- 117
- 118
- 119
- 120
- 121
- 122
- 123
- 124
- 125
- 126
- 127
- 128
- 129
- 130
- 131
- 132
- 133
- 134
- 135
- 136
- 137
- 138
- 139
- 140
- 141
- 142
- 143
- 144
- 145
- 146
- 147
- 148
- 149
- 150
- 151
- 152
- 153
- 154
- 155
- 156
- 157
- 158
- 159
- 160
- 161
- 162
- 163
- 164
- 165
- 166
- 167
- 168
- 169
- 170
- 171
- 172
- 173
- 174
- 175
- 176
- 177
- 178
- 179
- 180
- 181
- 182
- 183
- 184
- 185
- 186
- 187
- 188
- 189
- 190
- 191
- 192
- 193
- 194
- 195
- 196
- 197
- 198
- 199
- 200
- 201
- 202
- 203
- 204
- 205
- 206
- 207
- 208
- 209
- 210
- 211
- 212
- 213
- 214
- 215
- 216
- 217
- 218
- 219
- 220
- 221
- 222
- 223
- 224
- 225
- 226
- 227
- 228
- 229
- 230
- 231
- 232
- 233
- 234
- 235
- 236
- 237
- 238
- 239
- 240
- 241
- 242
- 243
- 244
- 245
- 246
- 247
- 248
- 249
- 250
- 251
- 252
- 253
- 254
- 255
- 256
- 257
- 258
- 259
- 260
- 261
- 262
- 263
- 264
- 265
- 266
- 267
- 268
- 269
- 270
- 271
- 272
- 273
- 274
- 275
- 276
- 277
- 278
- 279
- 280
- 281
- 282
- 283
- 284
- 285
- 286
- 287
- 288
- 289
- 290
- 291
- 292
- 293
- 294
- 295
- 296
- 297
- 298
- 299
- 300
- 301
- 302
- 303
- 304
- 305
- 306
- 307
- 308
- 309
- 310
- 311
- 312
- 313
- 314
- 315
- 316
- 317
- 318
- 319
- 320
- 321
- 322
- 323
- 324
- 325
- 326
- 327
- 328
- 329
- 330
- 331
- 332
- 333
- 334
- 335
- 336
- 337
- 338
- 339
- 340
- 341
- 342
- 343
- 344
- 345
- 346
- 347
- 348
- 349
- 350
- 351
- 352
- 353
- 354
- 355
- 356
- 357
- 358
- 359
- 360
- 361
- 362
- 363
- 364
- 365
- 366
- 367
- 368
- 369
- 370
- 371
- 372
- 373
- 374
- 375
- 376
- 377
- 378
- 379
- 380
- 381
- 382
- 383
- 384
- 385
- 386
- 387
- 388
- 389
- 390
- 391
- 392
- 393
- 394
- 395
- 396
- 397
- 398
- 399
- 400
- 401
- 402
- 403
- 404
- 405
- 406
- 407
- 408
- 409
- 410
- 411
- 412
- 413
- 414
- 415
- 416
- 417
- 418
- 419
- 420
- 421
- 422
- 423
- 424
- 425
- 426
- 427
- 428
- 429
- 430
- 431
- 432
- 433
- 434
- 435
- 436
- 437
- 438
- 439
- 440
- 441
- 442
- 443
- 444
- 445
- 446
- 447
- 448
- 449
- 450
- 451
- 452
- 453
- 454
- 455
- 456
- 457
- 458
- 459
- 460
- 461
- 462
- 463
- 464
- 465
- 466
- 467
- 468
- 469
- 470
- 471
- 472
- 473
- 474
- 475
- 476
- 477
- 478
- 479
- 480
- 481
- 482
- 483
- 484
- 485
- 486
- 487
- 488
- 489
- 490
- 491
- 492
- 493
- 494
- 495
- 496
- 497
- 498
- 499
- 500
- 501
- 502
- 503
- 504
- 505
- 506
- 507
- 508
- 509
- 510
- 511
- 512
- 513
- 514
- 515
- 516
- 517
- 518
- 519
- 520
- 521
- 522
- 523
- 524
- 525
- 526
- 527
- 528
- 529
- 530
- 531
- 532
- 533
- 534
- 535
- 536
- 537
- 538
- 539
- 540
- 541
- 542
- 543
- 544
- 545
- 546
- 547
- 548
- 549
- 550
- 551
- 552
- 553
- 554
- 555
- 556
- 557
- 558
- 559
- 560
- 561
- 562
- 563
- 564
- 565
- 566
- 567
- 568
- 569
- 570
- 571
- 572
- 573
- 574
- 575
- 576
- 577
- 578
- 579
- 580
- 581
- 582
- 583
- 584
- 585
- 586
- 587
- 588
- 589
- 590
- 591
- 592
- 593
- 594
- 595
- 596
- 597
- 598
- 599
- 600
- 601
- 602
- 603
- 604
- 605
- 606
- 607
- 608
- 609
- 610
- 611
- 612
- 613
- 614
- 615
- 616
- 617
- 618
- 619
- 620
- 621
- 622
- 623
- 624
- 625
- 626
- 627
- 628
- 629
- 630
- 631
- 632
- 633
- 634
- 635
- 636
- 637
- 638
- 639
- 640
- 641
- 642
- 643
- 644
- 645
- 646
- 647
- 648
- 649
- 650
- 651
- 652
- 653
- 654
- 655
- 656
- 657
- 658
- 659
- 660
- 661
- 662
- 663
- 664
- 665
- 666
- 667
- 668
- 669
- 670
- 671
- 672
- 673
- 674
- 675
- 676
- 677
- 678
- 679
- 680
- 681
- 682
- 683
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
线索二叉树
若结点有左孩子,则left指针指向左孩子,否则left指针指向其前驱结点。若结点有右孩子,则right指针指向其右孩子,否则指向其后继结点。这种结构中,指向前驱和后继的指针称为线索,对二叉树以某种次序进行遍历并且加上线索的过程称为线索化,线索化了的二叉树称为线索二叉树。
这种结构我们可以在结点上设置标记,当标记为false时说明指向的为孩子结点,当标记为true时说明指向的为前驱或后继。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
线索化实质上是将二叉链表中的空指针指向相应结点的前驱或后继地址,而前驱和后继的信息只有遍历时才能得到,因此线索化的过程其实是在遍历过程中修改空指针的过程。
中序遍历线索化
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
中序遍历线索二叉树
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
树、森林和二叉树的转换
在前面讲树的存储结构时,我们知道树的孩子兄弟表示法可以将一棵树用二叉链表进行存储,借助二叉链表,树和二叉树可以相互进行转换。树的孩子兄弟链表从物理结构上与二叉树的二叉链表是完全相同的,只是逻辑含义不同。
树转换为二叉树
转换步骤
- 1
- 2
- 3
- 4
森林转换为二叉树
森林是若干棵树的集合。森林同样也可以转换为二叉树。
转换步骤
- 1
- 2
- 3
二叉树还原为树
转换步骤
- 1
- 2
- 3
- 4
二叉树还原为森林
怎么判断一棵二叉树是转换为树还是森林呢?只需要看这棵二叉树的根结点有没有右孩子,有就转换为森林,没有就转换为树。
转换步骤
- 1
- 2
- 3
树与森林的遍历
树的遍历方法主要有以下两种:
(1)先序遍历:若树非空,则遍历方式为:访问根结点,然后从左到右,依次先序遍历每一课子树。
(2)后序遍历:若树非空,则遍历方式为:从左到右,依次后序遍历根结点的每一棵子树,然后访问根结点。
森林的遍历方法主要有以下两种:
(1)先序遍历:若森林非空,则遍历方式为:访问森林第一棵树的根结点,先序遍历第一棵树的根结点的子树,先序遍历剩余的树构成的森林。
(2)中序遍历:若森林非空,则遍历方式为:中序遍历森林中第一棵树的根结点的子树,访问第一棵树的根结点,中序遍历剩余的树构成的森林。
(3)后序遍历:若森林非空,则遍历方式为:后序遍历森林中第一棵树的根结点的子树,然后后序遍历剩余的树构成的森林,最后访问第一棵树的根结点。
树
树是n个结点的有限集。n=0时称为空树。在任意一颗非空树中:(1)有且仅有一个特定的称为根的结点;(2)当n>1时,其余结点可分为m(m>0)个互不相交的有限集T1,T2…..Tm,其中每一个集合本身又是一棵树,并且称为根的子树。如下图
-
结点: 树的结点包含一个数据元素及若干指向其子树的分支。
-
结点的度:结点拥有的子树数称为结点的度。
-
叶结点:度为0的结点称为叶结点或终端结点。
-
分支节点:度不为0的结点称为非终端结点或分支结点。除根节点之外,分支结点也称为内部结点。
-
树的度:树中各结点度的最大值。如下图,结点度的最大值是D的度,所以树的度也为3
-
孩子结点:结点的直接后继称为该结点的孩子结点。
-
双亲结点:一个结点的直接前驱称为该结点的双亲结点。
-
兄弟结点:同一双亲结点的孩子结点之间互称兄弟结点。
-
祖先结点:结点的祖先结点是指从根结点到该结点路径上的所有结点。
-
子孙结点:一个结点的直接后继和间接后继称为该结点的子孙结点。
-
结点的层次:从根结点开始定义,根结点的层次为1,根的直接后继层次为2,以此类推。
-
堂兄弟结点:父亲是兄弟关系或堂兄关系的结点称为堂兄弟结点。
-
树的高度(深度):树中结点的最大层次称为树的高度或者深度。
-
有序树:如果将树中结点的各子树看成从左到右是有次序的,不能互换的,则称该树为有序树,否则称为无序树。
-
森林:m颗互不相交的树的集合称为森林。将一棵非空树的根结点删去,树就变成森林;反之,给森林增加一个统一的根结点,森林就变成一棵树。
树的存储结构
说到存储结构,就很自然的想到我们前面讲过的顺序存储和链式存储两种结构。树是一种一对多的结构,那么如何存储能表示结点之间的关系呢?
树的主要存储方法有三种:
双亲表示法
这种方法用一组连续的空间存储树的结点,同时在每个结点中,附设一个指示器指示其双亲结点在表中的位置,也就是说每个结点除了保存自己的数据,还知道其双亲的位置。
由于根结点是没有双亲的,所以我们默认设置根结点的的双亲位置设置为-1.
这种存储方式,利用了树中每个结点(根结点除外)只有一个双亲结点的性质,如果查找结点的双亲结点,时间复杂度仅为O(1),很容易找到根结点,但是如果要找某个结点的孩子结点就需要遍历整个结构才行。
孩子表示法
这种方法通常是把每个结点的孩子结点排列起来,构成一个单链表,称为孩子链表。n个结点共有n个孩子链表(叶子结点的孩子链表为空表),而n个结点的数据和n个孩子链表的头指针组成一个顺序表。
孩子链表中的结点结构,child为该结点在数组中的下标,next指向下一个孩子结点。
数组中的结点结构,data为数据,firstchild指向孩子链表的第一个结点
这样的结构对于我们要查找某个结点的孩子或者兄弟比较方便,只需要查找该结点的孩子链表即可,可是如果要查找某个结点的父亲,那就比较麻烦,需要遍历整个结构。那么我们可不可以把双亲表示法和孩子表示法结合一下呢?当然可以
孩子兄弟表示法
这种方法是每个结点设置两个指针域,指向该结点的第一个孩子结点和右兄弟结点,这种表示法又被称为树的二叉表示法,或者二叉链表表示法。
这种存储结构便于实现树的各种操作,当然要想找到某个结点的双亲也是有一定的缺陷,不过我们完全可以添加一个parent指针来解决这个问题。
二叉树
二叉树是一种简单而重要的树结构,任何树都可以转化为二叉树进行处理,二叉树非常适合计算机处理。
二叉树是n个结点的有限集合,该集合为空时被称为空二叉树,二叉树每个结点的度数都不能大于2,每个结点的孩子结点次序不能任意颠倒。
二叉树每个结点最多有两棵子树,没有子树或者一棵都可以,左子树和右子树是有顺序的,次序不能任意颠倒,即使树中某结点只有一棵子树,也要区分左右。
特殊二叉树
-
斜树:所有的结点都只有右子树的二叉树被称为右斜树,所有的结点都只有左子树的二叉树称为左斜树。两者统称为斜树。
-
满二叉树:一颗二叉树中,如果所有分支结点都存在左子树和右子树,并且所有叶子结点都在同一层上,这样的二叉树称为满二叉树。 满二叉树的顺序表示,从二叉树的根开始,从上到下从左到右从1顺序编号。
- 完全二叉树:对一棵具有n个结点的二叉树编号,如果编号为i的结点和同样深度的满二叉树中编号为i的结点在二叉树中位置完全相同,则称为完全二叉树。满二叉树肯定为完全二叉树,完全二叉树不一定是满二叉树。
二叉树的性质
-
性质一:在二叉树的第i层上最多有2^(i-1)个结点(i >=1)
-
性质二:深度为k的二叉树至多有2^k-1个结点(k>=1)
-
性质三:对任意一棵二叉树T,若终端结点数为n0,而其度数为2的结点数为n2,则n0=n2+1.终端结点数其实就是叶子结点数
-
性质四:具有n个结点的完全二叉树的深度为[log2n]+1([x]符号表示不大于x的最大整数)
-
性质五: 对于具有n个结点的完全二叉树,如果按照从上到下从左到右的顺序对二叉树中的所有结点从1开始进行顺序编号,则对于任意的序号为i的结点有:
(1)如i=1,则序号为i的结点是根结点,无双亲结点;如i>1,则序号为i的结点的双亲结点为 [i/2]
(2)如2i>n,则序号为i的结点无左孩子;如2i<=n,则序号为i的结点的左孩子结点的序号为2i。
(3)如2i+1>n,则序号为i的结点无右孩子;如2i+1<=n,则序号为i的结点的右孩子结点的序号为2i+1.
这几个公式证明还是蛮简单的,如果有兴趣可以参考百度证明一下。
二叉树的顺序存储结构
二叉树的顺序存储结构就是用数组来存储二叉树中的结点,并且数组的下标要体现结点之间的存储关系。
这种存储方式对完全二叉树而言是非常方便的,因为完全二叉树的定义比较严格,我们来看一下。
但是如果是一般的二叉树呢?
如果是一般的二叉树,我们需要将不存在的结点设置为”^”,将其补成一颗完全二叉树来看待。如下图:颜色浅的是不存在的。
顺序结构对一般的二叉树而言,空间浪费太大,所以一般只用于完全二叉树。
二叉树的链式存储结构
对于任意二叉树来说,每个结点最多有两个孩子,所以结点的结构应该设计数据域、左孩子域、右孩子域。
如果有需要,可以增加一个parent域,指向该结点的双亲,这种结构就称为二叉树的三叉链表存储结构。
二叉树的遍历
二叉树的遍历是指按照某种规律对二叉树中的每个结点进行访问且仅访问一次。访问可指计算二叉树中的数据信息,打印该结点信息,包括对结点进行任何其他操作。
二叉树遍历方式:
先序遍历
规则是若二叉树为空,则空操作返回。否则先访问根节点,然后先序遍历左子树,再先序遍历右子树。如下图:遍历顺序为ABDGHCEIF
中序遍历
规则是若二叉树为空,则空操作返回。否则先中序遍历根节点的左子树,然后访问根节点,然后中序遍历右子树。如下图,遍历顺序为GDHBAEICF
后序遍历
规则是若二叉树为空,则空操作返回。否则后序遍历左子树,然后后续遍历右子树,然后访问根节点。如下图,遍历顺序为GHDBIEFCA
层序遍历
规则是若二叉树为空,则空操作返回。否则从树的第一层,即根节点开始,从上到下从左到右逐层遍历。如下图,遍历顺序为:ABCDEFGHI
二叉树的遍历算法
二叉树的遍历操作可以采用递归的方式来运行,极其简洁。
先序遍历算法
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
中序遍历算法
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
后序遍历算法
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
递归遍历算法的时间复杂度分析:设二叉树有n个结点,对每个结点都要执行访问和后退操作,对结点的访问为n次,所以时间复杂度为O(n)。
基于栈的递归消除,我们可以不用递归的方式进行遍历
先序遍历二叉树的非递归算法
非递归算法需要设置一个堆栈,保留当前结点指针,然后根据先序遍历规则进行访问。
具体看代码,一目了然。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
中序遍历二叉树的非递归算法
中序和先序都差不多,只不过位置需要变化一下。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
后序遍历二叉树的非递归算法
后序遍历的非递归算法比较复杂,因为后序遍历要求左、右子树都访问完后,再访问根结点,那么如何判断左、右子树都已经访问过了呢?解决方法有很多种。这里我们采用的是判断刚访问过的结点是不是当前栈顶结点的右孩子。
有三种情况
- 1
- 2
- 3
- 4
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
由遍历序列确定二叉树
有这样一个问题,已知一棵二叉树的先序遍历序列为ABCDEF,中序遍历序列为CBAEDF,那么这棵二叉树的后序遍历结果是什么?
- 1
- 2
- 3
- 4
- 5
- 6
只有一种遍历序列是无法确定二叉树的,至少需要两种遍历序列。
- 1
- 2
- 3
- 4
二叉树的实现
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
- 100
- 101
- 102
- 103
- 104
- 105
- 106
- 107
- 108
- 109
- 110
- 111
- 112
- 113
- 114
- 115
- 116
- 117
- 118
- 119
- 120
- 121
- 122
- 123
- 124
- 125
- 126
- 127
- 128
- 129
- 130
- 131
- 132
- 133
- 134
- 135
- 136
- 137
- 138
- 139
- 140
- 141
- 142
- 143
- 144
- 145
- 146
- 147
- 148
- 149
- 150
- 151
- 152
- 153
- 154
- 155
- 156
- 157
- 158
- 159
- 160
- 161
- 162
- 163
- 164
- 165
- 166
- 167
- 168
- 169
- 170
- 171
- 172
- 173
- 174
- 175
- 176
- 177
- 178
- 179
- 180
- 181
- 182
- 183
- 184
- 185
- 186
- 187
- 188
- 189
- 190
- 191
- 192
- 193
- 194
- 195
- 196
- 197
- 198
- 199
- 200
- 201
- 202
- 203
- 204
- 205
- 206
- 207
- 208
- 209
- 210
- 211
- 212
- 213
- 214
- 215
- 216
- 217
- 218
- 219
- 220
- 221
- 222
- 223
- 224
- 225
- 226
- 227
- 228
- 229
- 230
- 231
- 232
- 233
- 234
- 235
- 236
- 237
- 238
- 239
- 240
- 241
- 242
- 243
- 244
- 245
- 246
- 247
- 248
- 249
- 250
- 251
- 252
- 253
- 254
- 255
- 256
- 257
- 258
- 259
- 260
- 261
- 262
- 263
- 264
- 265
- 266
- 267
- 268
- 269
- 270
- 271
- 272
- 273
- 274
- 275
- 276
- 277
- 278
- 279
- 280
- 281
- 282
- 283
- 284
- 285
- 286
- 287
- 288
- 289
- 290
- 291
- 292
- 293
- 294
- 295
- 296
- 297
- 298
- 299
- 300
- 301
- 302
- 303
- 304
- 305
- 306
- 307
- 308
- 309
- 310
- 311
- 312
- 313
- 314
- 315
- 316
- 317
- 318
- 319
- 320
- 321
- 322
- 323
- 324
- 325
- 326
- 327
- 328
- 329
- 330
- 331
- 332
- 333
- 334
- 335
- 336
- 337
- 338
- 339
- 340
- 341
- 342
- 343
- 344
- 345
- 346
- 347
- 348
- 349
- 350
- 351
- 352
- 353
- 354
- 355
- 356
- 357
- 358
- 359
- 360
- 361
- 362
- 363
- 364
- 365
- 366
- 367
- 368
- 369
- 370
- 371
- 372
- 373
- 374
- 375
- 376
- 377
- 378
- 379
- 380
- 381
- 382
- 383
- 384
- 385
- 386
- 387
- 388
- 389
- 390
- 391
- 392
- 393
- 394
- 395
- 396
- 397
- 398
- 399
- 400
- 401
- 402
- 403
- 404
- 405
- 406
- 407
- 408
- 409
- 410
- 411
- 412
- 413
- 414
- 415
- 416
- 417
- 418
- 419
- 420
- 421
- 422
- 423
- 424
- 425
- 426
- 427
- 428
- 429
- 430
- 431
- 432
- 433
- 434
- 435
- 436
- 437
- 438
- 439
- 440
- 441
- 442
- 443
- 444
- 445
- 446
- 447
- 448
- 449
- 450
- 451
- 452
- 453
- 454
- 455
- 456
- 457
- 458
- 459
- 460
- 461
- 462
- 463
- 464
- 465
- 466
- 467
- 468
- 469
- 470
- 471
- 472
- 473
- 474
- 475
- 476
- 477
- 478
- 479
- 480
- 481
- 482
- 483
- 484
- 485
- 486
- 487
- 488
- 489
- 490
- 491
- 492
- 493
- 494
- 495
- 496
- 497
- 498
- 499
- 500
- 501
- 502
- 503
- 504
- 505
- 506
- 507
- 508
- 509
- 510
- 511
- 512
- 513
- 514
- 515
- 516
- 517
- 518
- 519
- 520
- 521
- 522
- 523
- 524
- 525
- 526
- 527
- 528
- 529
- 530
- 531
- 532
- 533
- 534
- 535
- 536
- 537
- 538
- 539
- 540
- 541
- 542
- 543
- 544
- 545
- 546
- 547
- 548
- 549
- 550
- 551
- 552
- 553
- 554
- 555
- 556
- 557
- 558
- 559
- 560
- 561
- 562
- 563
- 564
- 565
- 566
- 567
- 568
- 569
- 570
- 571
- 572
- 573
- 574
- 575
- 576
- 577
- 578
- 579
- 580
- 581
- 582
- 583
- 584
- 585
- 586
- 587
- 588
- 589
- 590
- 591
- 592
- 593
- 594
- 595
- 596
- 597
- 598
- 599
- 600
- 601
- 602
- 603
- 604
- 605
- 606
- 607
- 608
- 609
- 610
- 611
- 612
- 613
- 614
- 615
- 616
- 617
- 618
- 619
- 620
- 621
- 622
- 623
- 624
- 625
- 626
- 627
- 628
- 629
- 630
- 631
- 632
- 633
- 634
- 635
- 636
- 637
- 638
- 639
- 640
- 641
- 642
- 643
- 644
- 645
- 646
- 647
- 648
- 649
- 650
- 651
- 652
- 653
- 654
- 655
- 656
- 657
- 658
- 659
- 660
- 661
- 662
- 663
- 664
- 665
- 666
- 667
- 668
- 669
- 670
- 671
- 672
- 673
- 674
- 675
- 676
- 677
- 678
- 679
- 680
- 681
- 682
- 683
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
线索二叉树
若结点有左孩子,则left指针指向左孩子,否则left指针指向其前驱结点。若结点有右孩子,则right指针指向其右孩子,否则指向其后继结点。这种结构中,指向前驱和后继的指针称为线索,对二叉树以某种次序进行遍历并且加上线索的过程称为线索化,线索化了的二叉树称为线索二叉树。
这种结构我们可以在结点上设置标记,当标记为false时说明指向的为孩子结点,当标记为true时说明指向的为前驱或后继。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
线索化实质上是将二叉链表中的空指针指向相应结点的前驱或后继地址,而前驱和后继的信息只有遍历时才能得到,因此线索化的过程其实是在遍历过程中修改空指针的过程。
中序遍历线索化
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
中序遍历线索二叉树
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
树、森林和二叉树的转换
在前面讲树的存储结构时,我们知道树的孩子兄弟表示法可以将一棵树用二叉链表进行存储,借助二叉链表,树和二叉树可以相互进行转换。树的孩子兄弟链表从物理结构上与二叉树的二叉链表是完全相同的,只是逻辑含义不同。
树转换为二叉树
转换步骤
- 1
- 2
- 3
- 4
森林转换为二叉树
森林是若干棵树的集合。森林同样也可以转换为二叉树。
转换步骤
- 1
- 2
- 3
二叉树还原为树
转换步骤
- 1
- 2
- 3
- 4
二叉树还原为森林
怎么判断一棵二叉树是转换为树还是森林呢?只需要看这棵二叉树的根结点有没有右孩子,有就转换为森林,没有就转换为树。
转换步骤
- 1
- 2
- 3
树与森林的遍历
树的遍历方法主要有以下两种:
(1)先序遍历:若树非空,则遍历方式为:访问根结点,然后从左到右,依次先序遍历每一课子树。
(2)后序遍历:若树非空,则遍历方式为:从左到右,依次后序遍历根结点的每一棵子树,然后访问根结点。
森林的遍历方法主要有以下两种:
(1)先序遍历:若森林非空,则遍历方式为:访问森林第一棵树的根结点,先序遍历第一棵树的根结点的子树,先序遍历剩余的树构成的森林。
(2)中序遍历:若森林非空,则遍历方式为:中序遍历森林中第一棵树的根结点的子树,访问第一棵树的根结点,中序遍历剩余的树构成的森林。
(3)后序遍历:若森林非空,则遍历方式为:后序遍历森林中第一棵树的根结点的子树,然后后序遍历剩余的树构成的森林,最后访问第一棵树的根结点。