一、种类
1.满二叉树:除了叶子节点外,每个节点都有2个子节点,节点数量为2的k次方 - 1
2.完全二叉树:底层从左到右连续
3.完美二叉树:同时具备满二叉树和完全二叉树的条件
4.二叉搜索树:左孩子的值 < 当前节点的值 < 右孩子的值
5.平衡二叉搜索树:左子树和右子树高度的绝对值 <= 1
二、存储方式
1.链式存储
2.线性存储
三、遍历方式
1.前序遍历
递归法
function traversal(cur, arr) {
if (cur == NULL) return;
arr.push(cur.val); // 中
traversal(cur.left, arr); // 左
traversal(cur.right, arr); // 右
return arr
}
迭代法
// 入栈 右 -> 左
// 出栈 中 -> 左 -> 右
var preorderTraversal = function(root, res = []) {
if(!root) return res;
const stack = [root];
let cur = null;
while(stack.length) {
cur = stack.pop();
res.push(cur.val);
cur.right && stack.push(cur.right);
cur.left && stack.push(cur.left);
}
return res;
};
2.中序遍历
递归法
function traversal(cur, arr) {
if (cur == NULL) return;
traversal(cur.left, arr); // 左
arr.push(cur.val); // 中
traversal(cur.right, arr); // 右
return arr
}
迭代法
// 入栈 左 -> 右
// 出栈 左 -> 中 -> 右
var inorderTraversal = function(root, res = []) {
const stack = [];
let cur = root;
while(stack.length || cur) {
if(cur) {
stack.push(cur);
// 左
cur = cur.left;
} else {
// --> 弹出 中
cur = stack.pop();
res.push(cur.val);
// 右
cur = cur.right;
}
};
return res;
};
3.后序遍历
递归法
function traversal(cur, arr) {
if (cur == NULL) return;
traversal(cur.left, arr); // 左
traversal(cur.right, arr); // 右
arr.push(cur.val); // 中
return arr
}
迭代法
// 入栈 左 -> 右
// 出栈 中 -> 右 -> 左 结果翻转
var postorderTraversal = function(root, res = []) {
if (!root) return res;
const stack = [root];
let cur = null;
do {
cur = stack.pop();
res.push(cur.val);
cur.left && stack.push(cur.left);
cur.right && stack.push(cur.right);
} while(stack.length);
return res.reverse();
};
4.层序遍历
var levelOrder = function(root) {
//二叉树的层序遍历
let res=[],queue=[];
queue.push(root);
if(root===null){
return res;
}
while(queue.length!==0){
// 记录当前层级节点数
let length=queue.length;
//存放每一层的节点
let curLevel=[];
for(let i=0;i<length;i++){
let node=queue.shift();
curLevel.push(node.val);
// 存放当前层下一层的节点
node.left&&queue.push(node.left);
node.right&&queue.push(node.right);
}
//把每一层的结果放到结果数组
res.push(curLevel);
}
return res;
};
四、构造二叉树
class Node { // 定义节点
constructor(val){
this.val = val
this.left = null
this.right = null
}
}
const createTree = (arr) => { // 创建二叉树
let tree = new Node(arr[0])
let Nodes = [tree]
let i = 1
for (let node of Nodes){
if (arr[i] === null) Nodes.push(node.left = null)
else Nodes.push(node.left = new Node(arr[i]))
i += 1
if (i == arr.length) return tree
if (arr[i] === null) Nodes.push(node.right = null)
else Nodes.push(node.right = new Node(arr[i]))
i += 1
if (i == arr.length) return tree
}
}