[{"data":1,"prerenderedAt":206},["ShallowReactive",2],{"content:\u002Fposts\u002F2024\u002Falgorithm-traversal":3,"surround:\u002Fposts\u002F2024\u002Falgorithm-traversal":195},{"id":4,"title":5,"body":6,"canonical":173,"categories":174,"date":176,"description":173,"draft":177,"extension":178,"image":179,"meta":180,"navigation":181,"path":182,"permalink":173,"readingTime":183,"recommend":173,"references":173,"seo":188,"sitemap":189,"stem":190,"tags":191,"type":173,"updated":193,"__hash__":194},"content\u002Fposts\u002F2024\u002Falgorithm-Traversal.md","二叉树",{"type":7,"value":8,"toc":151},"minimark",[9,14,18,21,34,37,48,51,54,57,61,67,70,76,79,82,85,91,94,100,103,106,109,115,118,124,127,130,133,139,142,148],[10,11,13],"h2",{"id":12},"什么是二叉树","什么是二叉树？",[15,16,17],"p",{},"二叉树是一种树形数据结构，其中每个节点最多有两个子节点，分别称为左子节点和右子节点。二叉树是一种非常基础且重要的数据结构，被广泛应用于计算机科学中的许多领域，包括算法、数据结构、数据库、编译器等。",[15,19,20],{},"二叉树的主要特性包括：",[22,23,24,28,31],"ol",{},[25,26,27],"li",{},"每个节点最多有两个子节点。",[25,29,30],{},"左子节点的值通常小于其父节点的值，而右子节点的值通常大于其父节点的值（这种二叉树称为二叉搜索树）。",[25,32,33],{},"二叉树的遍历通常有四种方式：前序遍历、中序遍历、后序遍历和层序遍历。",[15,35,36],{},"二叉树的表示方法有多种，其中一种常见的方法是使用节点对象，每个节点对象包含一个值和两个指向其左右子节点的引用。例如，在JavaScript中，可以使用以下代码定义一个二叉树节点：",[38,39,45],"pre",{"className":40,"code":42,"language":43,"meta":44},[41],"language-js","class TreeNode {\n    constructor(val, left = null, right = null) {\n        this.val = val;\n        this.left = left;\n        this.right = right;\n    }\n}\n","js","",[46,47,42],"code",{"__ignoreMap":44},[15,49,50],{},"在这个定义中，val是节点的值，left和right是指向左右子节点的引用。如果子节点不存在，则相应的引用为null。",[10,52,53],{"id":53},"前序遍历",[15,55,56],{},"二叉树的前序遍历是一种深度优先遍历方法，按照“根-左-右”的顺序访问节点。以下是前序遍历的两种实现方式：递归和迭代。",[58,59,60],"h3",{"id":60},"递归",[38,62,65],{"className":63,"code":64,"language":43,"meta":44},[41],"function preorderTraversal(root) {\n    if (!root)\n        return [];\n\n    const result = [];\n    const traversal = (node) => {\n        result.push(node.val);\n        if (node.left)\n            traversal(node.left);\n        if (node.right)\n            traversal(node.right);\n    };\n\n    traversal(root);\n    return result;\n}\n",[46,66,64],{"__ignoreMap":44},[58,68,69],{"id":69},"迭代",[38,71,74],{"className":72,"code":73,"language":43,"meta":44},[41],"function preorderTraversal(root) {\n    if (!root)\n        return [];\n\n    const stack = [root];\n    const result = [];\n\n    while (stack.length > 0) {\n        const node = stack.pop();\n        result.push(node.val);\n        if (node.right)\n            stack.push(node.right);\n        if (node.left)\n            stack.push(node.left);\n    }\n\n    return result;\n}\n",[46,75,73],{"__ignoreMap":44},[10,77,78],{"id":78},"中序遍历",[15,80,81],{},"二叉树的中序遍历是一种深度优先遍历方法，按照“左-根-右”的顺序访问节点。以下是中序遍历的两种实现方式：递归和迭代。",[58,83,60],{"id":84},"递归-1",[38,86,89],{"className":87,"code":88,"language":43,"meta":44},[41],"function inorderTraversal(root) {\n    if (!root)\n        return [];\n\n    const result = [];\n    const traversal = (node) => {\n        if (node.left)\n            traversal(node.left);\n        result.push(node.val);\n        if (node.right)\n            traversal(node.right);\n    };\n\n    traversal(root);\n    return result;\n}\n",[46,90,88],{"__ignoreMap":44},[58,92,69],{"id":93},"迭代-1",[38,95,98],{"className":96,"code":97,"language":43,"meta":44},[41],"function inorderTraversal(root) {\n    if (!root)\n        return [];\n\n    const stack = [];\n    let cur = root;\n    const result = [];\n\n    while (stack.length > 0 || cur) {\n        if (cur) {\n            stack.push(cur);\n            cur = cur.left;\n        }\n        else {\n            const node = stack.pop();\n            result.push(node.val);\n            cur = node.right;\n        }\n    }\n\n    return result;\n}\n",[46,99,97],{"__ignoreMap":44},[10,101,102],{"id":102},"后序遍历",[15,104,105],{},"二叉树的后序遍历是一种深度优先遍历方法，按照“左-右-根”的顺序访问节点。以下是后序遍历的迭代实现：",[58,107,60],{"id":108},"递归-2",[38,110,113],{"className":111,"code":112,"language":43,"meta":44},[41],"function inorderTraversal(root) {\n    if (!root)\n        return [];\n\n    const result = [];\n    const traversal = (node) => {\n        if (node.left)\n            traversal(node.left);\n        if (node.right)\n            traversal(node.right);\n        result.push(node.val);\n    };\n\n    traversal(root);\n    return result;\n}\n",[46,114,112],{"__ignoreMap":44},[58,116,69],{"id":117},"迭代-2",[38,119,122],{"className":120,"code":121,"language":43,"meta":44},[41],"function postorderTraversal(root) {\n    if (!root)\n        return [];\n\n    const stack = [root];\n    const result = [];\n\n    while (stack.length > 0) {\n        const node = stack.pop();\n        result.push(node.val);\n        if (node.left)\n            stack.push(node.left);\n        if (node.right)\n            stack.push(node.right);\n    }\n\n    return result.reverse(); \u002F\u002F 反转结果数组以获得正确的顺序\n}\n",[46,123,121],{"__ignoreMap":44},[10,125,126],{"id":126},"层序遍历",[15,128,129],{},"二叉树的层序遍历是一种广度优先遍历方法，按照“从上到下，从左到右”的顺序访问节点。以下是层序遍历的实现：",[58,131,60],{"id":132},"递归-3",[38,134,137],{"className":135,"code":136,"language":43,"meta":44},[41],"function levelOrderTraversal(root) {\n    const result = [];\n\n    function traverse(node, level = 0) {\n        if (!node)\n            return;\n\n        if (!result[level]) {\n            result[level] = [];\n        }\n\n        result[level].push(node.val);\n\n        traverse(node.left, level + 1);\n        traverse(node.right, level + 1);\n    }\n\n    traverse(root);\n    return result;\n}\n",[46,138,136],{"__ignoreMap":44},[58,140,69],{"id":141},"迭代-3",[38,143,146],{"className":144,"code":145,"language":43,"meta":44},[41],"function levelOrderTraversal(root) {\n    if (!root)\n        return [];\n\n    const queue = [root];\n    const result = [];\n\n    while (queue.length > 0) {\n        const levelSize = queue.length;\n        const level = [];\n\n        for (let i = 0; i \u003C levelSize; i++) {\n            const node = queue.shift();\n            level.push(node.val);\n\n            if (node.left)\n                queue.push(node.left);\n            if (node.right)\n                queue.push(node.right);\n        }\n\n        result.push(level);\n    }\n\n    return result;\n}\n",[46,147,145],{"__ignoreMap":44},[15,149,150],{},"在这个实现中，我们使用一个队列来保存当前层的节点。在每次循环中，我们首先记录当前层的节点数量，然后遍历这些节点，将它们的值添加到当前层的数组中，并将它们的子节点添加到队列中。最后，我们将当前层的数组添加到结果数组中。这样，我们就可以按照从上到下，从左到右的顺序访问二叉树的节点了。",{"title":44,"searchDepth":152,"depth":152,"links":153},4,[154,156,161,165,169],{"id":12,"depth":155,"text":13},2,{"id":53,"depth":155,"text":53,"children":157},[158,160],{"id":60,"depth":159,"text":60},3,{"id":69,"depth":159,"text":69},{"id":78,"depth":155,"text":78,"children":162},[163,164],{"id":84,"depth":159,"text":60},{"id":93,"depth":159,"text":69},{"id":102,"depth":155,"text":102,"children":166},[167,168],{"id":108,"depth":159,"text":60},{"id":117,"depth":159,"text":69},{"id":126,"depth":155,"text":126,"children":170},[171,172],{"id":132,"depth":159,"text":60},{"id":141,"depth":159,"text":69},null,[175],"代码","2024-02-17 16:35:14",false,"md","https:\u002F\u002Fbitmc.uno\u002Fpicgo\u002F67a1d8834efda-78.webp",{},true,"\u002Fposts\u002F2024\u002Falgorithm-traversal",{"text":184,"minutes":185,"time":186,"words":187},"5 min read",4.995,299700,999,{"title":5,"description":173},{"loc":182},"posts\u002F2024\u002Falgorithm-Traversal",[5,192],"算法","2025-02-04 15:19:14","FikRXp9MNKXvTbv3hfLT59QR8MvryWNxOO_I-PJSNMo",[196,201],{"title":197,"path":198,"stem":199,"date":200,"type":173,"children":-1},"RBAC权限控制简述","\u002Fposts\u002F2024\u002Fnest-rbac-permission-control","posts\u002F2024\u002Fnest-rbac-permission-control","2024-02-04 21:47:35",{"title":202,"path":203,"stem":204,"date":205,"type":173,"children":-1},"Vue3 批量注册自定义指令","\u002Fposts\u002F2024\u002Fvue3-batch-registers-custom-directive","posts\u002F2024\u002Fvue3-batch-registers-custom-directive","2024-03-07 20:23:27",1789642592765]