创建BinarySearchTree类
我们先来创建Node类来表示二叉搜索树中的每个节点,代码如下
export class Node {
constructor(key){
this.key = key; // 节点值
this.left = null; // 左侧子节点引用
this.right = null; // 右侧子节点引用
}
}
题目描述
给定一个二叉树,返回其节点值的锯齿形层序遍历。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。
例如:
给定二叉树 [3,9,20,null,null,15,7]
3
/ \
9 20
/ \
15 7
返回锯齿形层序遍历如下:
[
[3],
[20,9],
[15,7]
]
解题思路
独立思考很重要这个题目和102. 二叉树的层序遍历做法完全一样。
1.先将root节点全部压入栈中queue
2.申明一个result数组,作为返回结果,申明一个level作为记录层级
3.循环queue,申明一个临时temp数组,作为当前层的数据临时存放,最后push到result中
4.根据题目不同,在处理temp到result的过程有点不同,需要锯齿一样层序遍历,所以在偶数层的时候,需要把数据反过来存放
代码
思考1
/**
* Definition for a binary tree node.
* function TreeNode(val, left, right) {
* this.val = (val===undefined ? 0 : val)
* this.left = (left===undefined ? null : left)
* this.right = (right===undefined ? null : right)
* }
*/
/**
* @param {TreeNode} root
* @return {number[][]}
*/
var zigzagLevelOrder = function(root) {
if(!root) return [];
let queue = [root];
let result = [];
let level = 1;
while(queue.length){
let temp = [];
let size = queue.length;
for(let i = 0; i < size; i++){
let n = queue.shift();
// 在偶数层的时候,需要用unshift(),把数据添加到最前面
// 在奇数层时,需要用push(),把数据添加到队尾
if(!(level % 2)){
temp.unshift(n.val);
} else {
temp.push(n.val);
}
n.left && queue.push(n.left);
n.right && queue.push(n.right);
}
result.push(temp);
level++
}
return result;
};
思考2
可以根据正常的层序遍历的结果,对数据处理成题目需要的结构
/**
* Definition for a binary tree node.
* function TreeNode(val, left, right) {
* this.val = (val===undefined ? 0 : val)
* this.left = (left===undefined ? null : left)
* this.right = (right===undefined ? null : right)
* }
*/
/**
* @param {TreeNode} root
* @return {number[][]}
*/
var zigzagLevelOrder = function(root) {
if(!root) return [];
let queue = [root];
let result = [];
while(queue.length){
let temp = [];
let size = queue.length;
for(let i = 0; i < size; i++){
let n = queue.shift();
temp.push(n.val);
n.left && queue.push(n.left);
n.right && queue.push(n.right);
}
result.push(temp);
}
// 对返回的result进行循环处理,偶数层的数据,采用数组的reverse()方法
result.map((item, index) => {
if(index % 2){
item = item.reverse()
}
})
return result;
};