前言
二叉树相关的面试题也是前端面试中非常重要的一部分。那二叉树是什么样的一种结构呢?
二叉树是一种每个Node节点都不超过两个子树的树结构。一个完整的二叉树,每个节点都是由根节点、左节点、右节点组成。
// 定义节点类型
interface TreeNode {
// 当前节点的值
value: number;
// left节点有可能也是个树,也有可能直接是null
left: TreeNode | null;
// right节点有可能也是个树,也有可能直接是null
right: TreeNode | null;
}
// 定义一个二叉树
const binaryTree: TreeNode = {
value: 5,
left: {
value: 3,
left: {
value: 2,
left: null,
right: null
},
right: {
value: 4,
left: null,
right: null
}
},
right: {
value: 7,
left: {
value: 6,
left: null,
right: null
},
right: {
value: 8,
left: null,
right: null
}
}
}
在二叉树中,如果想遍历所有二叉树的节点,有三种不同的顺序:前序遍历、中序遍历、后序遍历
前序遍历
首先我们要明白什么是前序遍历,是指展示节点的顺序依次为:root -> left -> right。注意,一定要遵守这个规则。
我们从代码上来看一下。
/**
* @method preOrderTraversal
* @description 二叉树的前序遍历
* @param tree TreeNode | null 二叉树
* @returns void
*/
function preOrderTraversal(tree: TreeNode | null) {
// 1. 首先输出root节点即根节点
// 需要注意的时,tree有可能是null,临界条件判断,或者可以说是递归终止的条件
if (!tree) return;
// 输出根节点的值
console.log(tree.value);
// 2. 输出left节点
preOrderTraversal(tree.left);
// 3. 输出right节点
preOrderTraversal(tree.right);
}
调用函数,看下输出的结果:
// 5、3、2、4、7、6、8 => root -> left -> right
preOrderTraversal(binaryTree);
中序遍历
中序遍历的规则是:left -> root -> right
继续上代码:
/**
* @method preOrderTraversal
* @description 二叉树的前序遍历
* @param tree TreeNode | null 二叉树
* @returns void
*/
function middleOrderTraversal(tree: TreeNode | null) {
// 临界点判断
if (!tree) return;
// 1. 先输出left的值
middleOrderTraversal(tree.left);
// 2. 输出root根节点的值
console.log(tree.value);
// 3. 输出right的值
middleOrderTraversal(tree.right);
}
调用函数,看下输出的结果:
// 2、3、4、5、6、7、8 => left -> root -> right
middleOrderTraversal(binaryTree);
后序遍历
后序遍历的原则是:left -> right -> root
/**
* @method postOrderTraversal
* @description 二叉树的后序遍历
* @param tree
* @returns
*/
function postOrderTraversal(tree: TreeNode | null) {
// 临界点判断
if (!tree) return;
// 1. 先输出left的值
postOrderTraversal(tree.left);
// 2. 输出right的值
postOrderTraversal(tree.right);
// 3. 输出根节点的值
console.log(tree.value);
}
调用函数,看下输出的结果:
// 2、4、3、6、8、7、5 => left -> root -> right
postOrderTraversal(binaryTree);