[算法练习2] - 二叉树E
遍历方法
经典的方法有三种,前序遍历、中序遍历和后序遍历。其中,前、中、后序,表示的是节点与它的左右子树节点遍历打印的先后顺序。
前序遍历是指,对于树中的任意节点来说,先打印这个节点,然后再打印它的左子树,最后打印它的右子树。
中序遍历是指,对于树中的任意节点来说,先打印它的左子树,然后再打印它本身,最后打印它的右子树。
后序遍历是指,对于树中的任意节点来说,先打印它的左子树,然后再打印它的右子树,最后打印这个节点本身。
实际上,二叉树的前、中、后序遍历就是一个递归的过程。比如,前序遍历,其实就是先打印根节点,然后再递归地打印左子树,最后递归地打印右子树。
写递归代码的关键,就是看能不能写出递推公式,而写递推公式的关键就是,如果要解决问题A,就假设子问题B、C已经解决,然后再来看如何利用B、C来解决A。所以,我们可以把前、中、后序遍历的递推公式都写出来。
前序遍历的递推公式:
preOrder( r ) = print r->preOrder(r->left)->preOrder(r->right)
中序遍历的递推公式:
inOrder( r ) = inOrder(r->left)->print r->inOrder(r->right)
后序遍历的递推公式:
postOrder( r ) = postOrder(r->left)->postOrder(r->right)->print r
// 定义二叉树节点类
class TreeNode {
constructor(val) {
this.val = val;
this.left = null;
this.right = null;
}
}
// 中序遍历函数
function inOrderTraversal(root) {
if (root === null) {
return;
}
inOrderTraversal(root.left); // 递归遍历左子树
console.log(root.val); // 处理当前节点(这里使用打印操作)
inOrderTraversal(root.right); // 递归遍历右子树
}
// 前序遍历函数
function preOrderTraversal(root) {
if (root === null) {
return;
}
console.log(root.val); // 处理当前节点(这里使用打印操作)
preOrderTraversal(root.left); // 递归遍历左子树
preOrderTraversal(root.right); // 递归遍历右子树
}
// 后序遍历函数
function postOrderTraversal(root) {
if (root === null) {
return;
}
postOrderTraversal(root.left); // 递归遍历左子树
postOrderTraversal(root.right); // 递归遍历右子树
console.log(root.val); // 处理当前节点(这里使用打印操作)
}
// 创建二叉树示例
const root = new TreeNode(1);
root.left = new TreeNode(2);
root.right = new TreeNode(3);
root.left.left = new TreeNode(4);
root.left.right = new TreeNode(5);
// 执行中序遍历
inOrderTraversal(root);