一、二叉树理论基础
1、二叉树的种类:满二叉树、完全二叉树、二叉搜索树、平衡二叉搜索树;
2、存储方式:链式存储(用指针)、顺序存储(用数组);
3、遍历方式:深度优先遍历、广度优先遍历
- 深度优先遍历(一条道走到底再回过头接着一条道走到黑,如此循环往复)
- 前序遍历(递归法,迭代法)根左右
- 中序遍历(递归法,迭代法)左根右
- 后序遍历(递归法,迭代法)左右根
- 广度优先遍历(同级节点全部遍历完再接着向下级遍历)
- 层次遍历(迭代法)
4、二叉树的定义:
用JS和TS代码分别来实现一下在链式存储下,二叉树节点的定义方式,如下所示:
function TreeNode(val, left, right) {
this.val = val;
this.left = left !== undefined ? left : null;
this.right = right !== undefined ? right : null;
}
class TreeNode {
public val: number;
public left: TreeNode | null;
public right: TreeNode | null;
constructor(val, left, right) {
this.val = val;
this.left = left !== undefined ? left : null;
this.right = right !== undefined ? right : null;
}
}
二、二叉树的递归遍历
递归算法三要素:
1、确定递归函数的参数;
2、确定递归的终止条件;
3、确定递归的单层逻辑,重复调用自身来实现递归。
二叉树的前/中/后序遍历,按照递归的方式来写一遍,对应leetcode题目为:144/94/145。
三、二叉树的迭代遍历
迭代遍历的思路就是用栈来实现遍历,以数组为例子,实现入栈和出栈,通过while循环。
二叉树的前/中/后序遍历,按照递归的方式来写一遍,对应leetcode题目为:144/94/145。
四、二叉树的层序遍历
leetcode题目链接:102.二叉树的层序遍历
题目描述:
给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。
返回的是一个二维数组,需要借助队列来实现,队列先进先出,符合一层一层遍历的逻辑,
层序遍历采用的是广度优先遍历。
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;
};