1、二叉树定义
二叉树是指满足以下要求的树:
- 它可以没有根结点,作为一棵空树存在
- 如果它不是空树,那么必须由根结点、左子树和右子树组成,且左右子树都是二叉树。
2、二叉树编码实现
在 JS 中,二叉树使用对象来定义。它的结构分为三块:数据域,左指针、右指针
// 二叉树结点构造函数
function TreeNode(val) {
this.val = val;
this.left = this.right = null;
}
3、二叉树遍历
按照顺序规则的不同,遍历方式有以下三种:先序遍历、中序遍历、后序遍历
提示:二叉树的各种姿势的遍历,是非常容易作为独立命题点来考察的,而且这个考察的频率非常高
备注:其实所谓的先序、中序和后序,先、中、后其实就是指根结点的遍历时机
先序遍历实现:
// 所有遍历函数的入参都是树的根结点对象
function preorder(root) {
// 递归边界,root 为空
if(!root) {
return
}
// 输出当前遍历的结点值
console.log('当前遍历的结点值是:', root.val)
// 递归遍历左子树
preorder(root.left)
// 递归遍历右子树
preorder(root.right)
}
中序遍历实现:
// 所有遍历函数的入参都是树的根结点对象
function inorder(root) {
// 递归边界,root 为空
if(!root) {
return
}
// 递归遍历左子树
inorder(root.left)
// 输出当前遍历的结点值
console.log('当前遍历的结点值是:', root.val)
// 递归遍历右子树
inorder(root.right)
}
后序遍历:
function postorder(root) {
// 递归边界,root 为空
if(!root) {
return
}
// 递归遍历左子树
postorder(root.left)
// 递归遍历右子树
postorder(root.right)
// 输出当前遍历的结点值
console.log('当前遍历的结点值是:', root.val)
}
提示:对于二叉树的先、中、后序遍历,各位只要掌握了其中一种的思路,就可以举一反三、顺势推导其它三种思路。不过,我个人的建议,仍然是以默写的标准来要求自己,面试时不要指望推导