二叉树和二叉搜索树
二叉树中的节点最多只能有两个子节点:一个是左侧子节点,另一个是右侧子节点。这个定义有助于我们写出更高效地在树中插入,查找和删除节点的算法。二叉树在计算机科学中的应用非常广泛。
二叉搜索树BST是二叉树的一种,但是只允许你在左侧节点存储(比父节点)小的值,在右侧节点存储(比父节点)大的值。
位于树顶部的节点叫做根节点(11)。它没有父节点。树中的每个元素都叫作节点,节点分为内部节点和外部节点。至少有一个子节点的节点称为内部节点(7,5,9,15,13和20)是内部节点。没有子元素的节点称为外部节点或叶节点(3,6,8,,10,12,14,18和15是叶节点)。
题目描述
给定一个二叉树,返回其节点值自底向上的层序遍历。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)
例如:
给定二叉树 [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
返回其自底向上的层序遍历为:
[
[15,7],
[9,20],
[3]
]
解题思路
思考很重要,题目要求我们返回自底向上的层序遍历。我们可以按照正常的自上而下的,每层自左而右层序遍历去遍历树。然后对返回结果反转数组中元素的顺序,可以用reverse()方法
* 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 levelOrderBottom = 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);
}
return result.reverse();
};
unshift(),将新元素添加到数组的开头,并返回新的长度。
对于最后的返回数据,result.push()方法,可以直接用result.unshift(),最后return result。
/**
* 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 levelOrderBottom = 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.unshift(temp);
}
return result;
};