@@ -339,20 +339,23 @@ func (this *Codec) deserialize(data string) *TreeNode {
339
339
* @return {string}
340
340
*/
341
341
var serialize = function (root ) {
342
- if (! root) return ' []' ;
343
- let queue = [root];
344
- let res = ' ' ;
345
- while (queue .length ) {
346
- let node = queue .shift ();
347
- if (node) {
348
- res += node .val + ' ,' ;
349
- queue .push (node .left );
350
- queue .push (node .right );
342
+ if (root === null ) {
343
+ return null ;
344
+ }
345
+ const ans = [];
346
+ const q = [root];
347
+ let index = 0 ;
348
+ while (index < q .length ) {
349
+ const node = q[index++ ];
350
+ if (node !== null ) {
351
+ ans .push (node .val .toString ());
352
+ q .push (node .left );
353
+ q .push (node .right );
351
354
} else {
352
- res += ' null ' + ' , ' ;
355
+ ans . push ( ' # ' ) ;
353
356
}
354
357
}
355
- return ` [ ${ res . substring ( 0 , res . length - 1 ) } ] ` ;
358
+ return ans . join ( ' , ' ) ;
356
359
};
357
360
358
361
/**
@@ -362,22 +365,26 @@ var serialize = function (root) {
362
365
* @return {TreeNode}
363
366
*/
364
367
var deserialize = function (data ) {
365
- if (! data || data .length <= 2 ) return null ;
366
- let arr = data .substring (1 , data .length - 1 ).split (' ,' );
367
- let root = new TreeNode (arr .shift ());
368
- let queue = [root];
369
- while (queue .length ) {
370
- let node = queue .shift ();
371
- let leftVal = arr .shift ();
372
- if (leftVal !== ' null' ) {
373
- node .left = new TreeNode (leftVal);
374
- queue .push (node .left );
368
+ if (data === null ) {
369
+ return null ;
370
+ }
371
+ const vals = data .split (' ,' );
372
+ let i = 0 ;
373
+ const root = new TreeNode (parseInt (vals[i++ ]));
374
+ const q = [root];
375
+ let index = 0 ;
376
+ while (index < q .length ) {
377
+ const node = q[index++ ];
378
+ if (vals[i] !== ' #' ) {
379
+ node .left = new TreeNode (+ vals[i]);
380
+ q .push (node .left );
375
381
}
376
- let rightVal = arr . shift () ;
377
- if (rightVal !== ' null ' ) {
378
- node .right = new TreeNode (rightVal );
379
- queue .push (node .right );
382
+ i ++ ;
383
+ if (vals[i] !== ' # ' ) {
384
+ node .right = new TreeNode (+ vals[i] );
385
+ q .push (node .right );
380
386
}
387
+ i++ ;
381
388
}
382
389
return root;
383
390
};
@@ -401,239 +408,57 @@ var deserialize = function (data) {
401
408
* }
402
409
*/
403
410
public class Codec {
404
- public string serialize (TreeNode root ) {
405
- return rserialize (root , " " );
406
- }
407
-
408
- public TreeNode deserialize (string data ) {
409
- string [] dataArray = data .Split (" ," );
410
- LinkedList < string > dataList = new LinkedList <string >(dataArray .ToList ());
411
- return rdeserialize (dataList );
412
- }
413
411
414
- public string rserialize (TreeNode root , string str ) {
412
+ // Encodes a tree to a single string.
413
+ public string serialize (TreeNode root ) {
415
414
if (root == null ) {
416
- str += " None," ;
417
- } else {
418
- str += root .val .ToString () + " ," ;
419
- str = rserialize (root .left , str );
420
- str = rserialize (root .right , str );
421
- }
422
- return str ;
423
- }
424
-
425
- public TreeNode rdeserialize (LinkedList <string > dataList ) {
426
- if (dataList .First .Value .Equals (" None" )) {
427
- dataList .RemoveFirst ();
428
415
return null ;
429
416
}
430
-
431
- TreeNode root = new TreeNode (int .Parse (dataList .First .Value ));
432
- dataList .RemoveFirst ();
433
- root .left = rdeserialize (dataList );
434
- root .right = rdeserialize (dataList );
435
-
436
- return root ;
437
- }
438
- }
439
-
440
- // Your Codec object will be instantiated and called as such:
441
- // Codec codec = new Codec();
442
- // codec.deserialize(codec.serialize(root));
443
- ```
444
-
445
- <!-- tabs:end -->
446
-
447
- <!-- solution:end -->
448
-
449
- <!-- solution:start-->
450
-
451
- ### 方法二:前序遍历
452
-
453
- 当二叉树的前中后序列不包含叶子节点时需要前中、前后、中后三种组合方式之一才能确定一颗二叉树,但当前序和后序遍历序列中包含叶子节点时,可以仅通过前序或后序遍历序列构建一颗二叉树。
454
-
455
- 在前序遍历序列化时,我们以任意特殊字符表示叶子节点,返回序列化后的字符串;反序列化时对序列化字符串根据分隔符进行切分后使用列表的第一个元素作为二叉树的根节点,然后利用列表的其他元素递归生成左右子树即可。
456
-
457
- 时间复杂度 $O(n)$,空间复杂度 $O(n)$。其中 $n$ 为二叉树的节点个数。
458
-
459
- <!-- tabs:start -->
460
-
461
- #### C++
462
-
463
- ``` cpp
464
- /* *
465
- * Definition for a binary tree node.
466
- * struct TreeNode {
467
- * int val;
468
- * TreeNode *left;
469
- * TreeNode *right;
470
- * TreeNode(int x) : val(x), left(NULL), right(NULL) {}
471
- * };
472
- */
473
- class Codec {
474
- public:
475
- string empty = "#";
476
- string sep = ",";
477
- // Encodes a tree to a single string.
478
- string serialize(TreeNode* root) {
479
- if (!root) return empty + sep;
480
- string res = to_string(root->val) + sep;
481
- res += serialize(root->left);
482
- res += serialize(root->right);
483
- return res;
484
- }
485
-
486
- // Decodes your encoded data to tree.
487
- TreeNode* deserialize(string data) {
488
- list<string> nodes;
489
- size_t pos = 0;
490
- string node;
491
- while ((pos = data.find(sep)) != string::npos) {
492
- node = data.substr(0, pos);
493
- nodes.push_back(node);
494
- data.erase(0, pos + sep.length());
417
+ List < string > ans = new List <string >();
418
+ Queue < TreeNode > q = new Queue <TreeNode >();
419
+ q .Enqueue (root );
420
+ while (q .Count > 0 ) {
421
+ TreeNode node = q .Dequeue ();
422
+ if (node != null ) {
423
+ ans .Add (node .val .ToString ());
424
+ q .Enqueue (node .left );
425
+ q .Enqueue (node .right );
426
+ } else {
427
+ ans .Add (" #" );
428
+ }
495
429
}
496
- return deserialize(nodes);
497
- }
498
-
499
- TreeNode* deserialize (list<string >& data) {
500
- if (data.empty()) return nullptr;
501
- string first = data.front();
502
- data.pop_front();
503
- if (first == empty) return nullptr;
504
- TreeNode* root = new TreeNode(stoi(first));
505
- root->left = deserialize(data);
506
- root->right = deserialize(data);
507
- return root;
508
- }
509
- };
510
-
511
- // Your Codec object will be instantiated and called as such:
512
- // Codec codec;
513
- // codec.deserialize(codec.serialize(root));
514
- ```
515
-
516
- #### JavaScript
517
-
518
- ```js
519
- /**
520
- * Definition for a binary tree node.
521
- * function TreeNode(val) {
522
- * this.val = val;
523
- * this.left = this.right = null;
524
- * }
525
- */
526
-
527
- /**
528
- * Encodes a tree to a single string.
529
- *
530
- * @param {TreeNode} root
531
- * @return {string}
532
- */
533
- var serialize = function (root) {
534
- if (root == null) {
535
- return '#';
430
+ return string .Join (" ," , ans );
536
431
}
537
- const { val, left, right } = root;
538
- return `${val},${serialize(left)},${serialize(right)}`;
539
- };
540
432
541
- /**
542
- * Decodes your encoded data to tree.
543
- *
544
- * @param {string} data
545
- * @return {TreeNode}
546
- */
547
- var deserialize = function (data) {
548
- const vals = data.split(',');
549
- let index = 0;
550
- const dfs = () => {
551
- if (vals[index] == '#') {
552
- index++;
433
+ // Decodes your encoded data to tree.
434
+ public TreeNode deserialize (string data ) {
435
+ if (data == null ) {
553
436
return null ;
554
437
}
555
- const res = new TreeNode(vals[index++]);
556
- res.left = dfs();
557
- res.right = dfs();
558
- return res;
559
- };
560
- return dfs();
561
- };
562
-
563
- /**
564
- * Your functions will be called as such:
565
- * deserialize(serialize(root));
566
- */
567
- ```
568
-
569
- <!-- tabs:end -->
570
-
571
- <!-- solution:end -->
572
-
573
- <!-- solution:start-->
574
-
575
- ### 方法三:后序遍历
576
-
577
- 在后序遍历序列化时,我们以任意特殊字符表示叶子节点,返回序列化后的字符串;反序列化时对序列化字符串根据分隔符进行切分后使用列表的最后一个元素作为二叉树的根节点,然后利用列表的其他元素递归生成左右子树即可。
578
-
579
- 时间复杂度 $O(n)$,空间复杂度 $O(n)$。其中 $n$ 为二叉树的节点个数。
580
-
581
- <!-- tabs:start -->
582
-
583
- #### C++
584
-
585
- ``` cpp
586
- /* *
587
- * Definition for a binary tree node.
588
- * struct TreeNode {
589
- * int val;
590
- * TreeNode *left;
591
- * TreeNode *right;
592
- * TreeNode(int x) : val(x), left(NULL), right(NULL) {}
593
- * };
594
- */
595
- class Codec {
596
- public:
597
- string empty = "#";
598
- string sep = ",";
599
- // Encodes a tree to a single string.
600
- string serialize(TreeNode* root) {
601
- if (!root) return empty + sep;
602
- string res = "";
603
- res += serialize(root->left);
604
- res += serialize(root->right);
605
- res += to_string(root->val) + sep;
606
- return res;
607
- }
608
-
609
- // Decodes your encoded data to tree.
610
- TreeNode* deserialize(string data) {
611
- vector<string> nodes;
612
- size_t pos = 0;
613
- string node;
614
- while ((pos = data.find(sep)) != string::npos) {
615
- node = data.substr(0, pos);
616
- nodes.push_back(node);
617
- data.erase(0, pos + sep.length());
438
+ string [] vals = data .Split (',' );
439
+ int i = 0 ;
440
+ TreeNode root = new TreeNode (int .Parse (vals [i ++ ]));
441
+ Queue < TreeNode > q = new Queue <TreeNode >();
442
+ q .Enqueue (root );
443
+ while (q .Count > 0 ) {
444
+ TreeNode node = q .Dequeue ();
445
+ if (vals [i ] != " #" ) {
446
+ node .left = new TreeNode (int .Parse (vals [i ]));
447
+ q .Enqueue (node .left );
448
+ }
449
+ i ++ ;
450
+ if (vals [i ] != " #" ) {
451
+ node .right = new TreeNode (int .Parse (vals [i ]));
452
+ q .Enqueue (node .right );
453
+ }
454
+ i ++ ;
618
455
}
619
- return deserialize(nodes);
620
- }
621
-
622
- TreeNode* deserialize (vector<string >& nodes) {
623
- if (nodes.empty()) return nullptr;
624
- string front = nodes.back();
625
- nodes.pop_back();
626
- if (front == empty) return nullptr;
627
- TreeNode* root = new TreeNode(stoi(front));
628
- // 先构造右子树,后构造左子树
629
- root->right = deserialize(nodes);
630
- root->left = deserialize(nodes);
631
456
return root ;
632
457
}
633
- };
458
+ }
634
459
635
460
// Your Codec object will be instantiated and called as such:
636
- // Codec codec;
461
+ // Codec codec = new Codec() ;
637
462
// codec.deserialize(codec.serialize(root));
638
463
```
639
464
0 commit comments