标签:node Binary level top Level ret queue 二叉树 root
原题链接在此:https://leetcode.com/problems/binary-tree-level-order-traversal/
Given the root
of a binary tree, return the level order traversal of its nodes' values. (i.e., from left to right, level by level).
给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点,同层节点就放在同一个数组里面)。
比如:
Input: root = [3,9,20,null,null,15,7] Output: [[3],[9,20],[6,15,7]]
非常经典的一道题,一般会使用BFS(广度优先) 和 DFS(深度优先) 两种算法来解答
使用BFS,需要一个queue的辅助
首先把root放入queue中( queue = [ 3 ] ),
利用queue的先进先出的特点,判断如果queue不为空,则保存queue的length,循环遍历直到length为0。循环过程中需要做两件事,第一件事是把节点从queue的头中取出来,放入一个数组里,这个数组就是我们返回结果中的内层嵌套数组,并且把节点的左右子节点又放入queue中,便于接下来的遍历。
第一次循环过后,我们得到 ret =[ [3] ], queue = [ 9, 20 ],此时queue不为空,继续重复上一步
第二次循环后,我们得到 ret = [ [ 3 ], [ 9, 20 ] ], queue = [ 6, 15, 7 ]
第三次循环过后,我们就得到了 ret = [ [ 3 ], [ 9, 20 ] ,[ 6, 15, 7 ] ],此时queue为空,把ret结果return出去
var levelOrder = function(root) { let ret = []; let queue = []; queue.push(root); //把root放入queue中 leverOrderFunc(); return ret; function leverOrderFunc(){ while(queue.length){ let top, queLen = queue.length; let innerLevel = []; while(queLen--){ // 循环当前层的node let top = queue.shift(); if(top && top.val !== undefined){ innerLevel.push(top.val); if(top.left !== null){ queue.push(top.left); } if(top.right != null){ queue.push(top.right); } } } if(innerLevel.length){ ret.push(innerLevel) } } } };
使用DFS时,由于当前节点所在level是不变的,深度遍历时,只需要知道当前level,就能把元素放入当前level对应的数组中(每向下一层遍历,level + 1),还用到递归(BFS解法中,也可以把判断queue是否为空,改为如果queue不为空就调用递归循环)
var levelOrder = function(root) { let ret = []; traversal(root, ret, 0); return ret; function traversal(node, ret, level){ if(node === null) return; if(ret.length-1 < level) ret.push([]); ret[level].push(node.val); if(node.left !== null){ traversal(node.left,ret,level+1) } if(node.right !== null){ traversal(node.right,ret,level+1) } } }
标签:node,Binary,level,top,Level,ret,queue,二叉树,root 来源: https://www.cnblogs.com/daisygogogo/p/15701272.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。