用c++实现二叉树的之字形层序遍历

  介绍

这篇文章主要介绍”用c++实现二叉树的之字形层序遍历”,在日常操作中,相信很多人在用c++实现二叉树的之字形层序遍历问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答“用c++实现二叉树的之字形层序遍历”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

二叉树的之字形层序遍历

给定一个二叉树,返回,曲折程度顺序,遍历它的节点# 39;值。(从左到右,从右到左为下一个级别和候补之间)。

例如:
给定二进制tree [3、9、20、空,空,15日7],

,,,3
/\
9,20
/,15 \
,,7

返回顺序遍历的锯齿形水平为:

(
[3],
[20, 9],
[15, 7]
]

这道二叉树的之字形层序遍历是之前那道,二叉树层次顺序Traversal 的变形,不同之处在于一行是从左到右遍历,下一行是从右往左遍历,交叉往返的之字形的层序遍历,最简单直接的方法就是利用层序遍历,并使用一个变量问来统计当前的层数(从0开始),将所有的奇数层的结点值进行翻转一下即可,参见代码如下:

解法一:

class  Solution  {   公众:   ,,,vector祝辞,zigzagLevelOrder (TreeNode *,根),{   ,,,,,,,if (根),return  {};   ,,,,,,,vector祝辞,res;   ,,,,,,,queue, oneLevel;   ,,,,,,,,,,,for  (int 小姐:=,q.size();,小姐:祝辞,0;,——我),{   ,,,,,,,,,,,,,,,TreeNode  * t =, q.front ();, q.pop ();   ,,,,,,,,,,,,,,,oneLevel.push_back (t→val);   ,,,,,,,,,,,,,,,if  (t→左),q.push (t→左);   ,,,,,,,,,,,,,,,if  (t→右),q.push (t→右);   ,,,,,,,,,,,}   ,,,,,,,,,,,if  (cnt  %, 2,==, 1),反向(oneLevel.begin (),, oneLevel.end ());   ,,,,,,,,,,,res.push_back (oneLevel);   ,,,,,,,,,,,+ +问;   ,,,,,,,}   ,,,,,,,return  res;   ,,,}   };

我们可以将上面的解法进行优化一下,翻转数组虽然可行,但是比较耗时,假如能够直接计算出每个结点值在数组中的坐标,就可以直接进行更新了。由于每层的结点数是知道的,就是队列的元素个数,所以可以直接初始化数组的大小。此时使用一个变量leftToRight来标记顺序,初始时是正确的,当此变量为真正的时候,每次加入数组的位置就是我本身,若变量为假了,则加入到size-1-i位置上,这样就直接相当于翻转了数组。每层遍历完了之后,需要翻转,leftToRight变量,同时不要忘了将>解法二:

class  Solution  {   公众:   ,,,vector祝辞,zigzagLevelOrder (TreeNode *,根),{   ,,,,,,,if (根),return  {};   ,,,,,,,vector祝辞,res;   ,,,,,,,queue, oneLevel(大小);   ,,,,,,,,,,,for  (int 小姐:=,0;,小姐:& lt;,大小;,+ + i), {   ,,,,,,,,,,,,,,,TreeNode  * t =, q.front ();, q.pop ();   ,,,,,,,,,,,,,,,int  idx =, leftToRight  ?,小姐::,(size 作用;1,安康;i);   ,,,,,,,,,,,,,,,oneLevel [idx],=, t→val;   ,,,,,,,,,,,,,,,if  (t→左),q.push (t→左);   ,,,,,,,,,,,,,,,if  (t→右),q.push (t→右);   ,,,,,,,,,,,}   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null

用c++实现二叉树的之字形层序遍历