二叉树遍历 二叉树构造 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 class TreeNode { constructor (val ) { this .val = val; this .left = null ; this .right = null ; } } 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 ); root.right .left = new TreeNode (6 ); root.right .right = new TreeNode (7 );
深度优先遍历,前序遍历(Pre-order):根 → 左 → 右 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 function preorderRecursive (node ) { if (!node) return ; console .log ('深度优先遍历,根 -> 左 -> 右:' , node.val ); preorderRecursive (node.left ); preorderRecursive (node.right ); } preorderRecursive (root);
深度优先遍历,中序遍历(In-order):左 → 根 → 右 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 function inorderRecursive (node ) { if (!node) return ; inorderRecursive (node.left ); console .log ('深度优先遍历,左 -> 根 -> 右:' ,node.val ); inorderRecursive (node.right ); } inorderRecursive (root);
深度优先遍历,后序遍历(Post-order):左 → 右 → 根 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 function postorderRecursive (node ) { if (!node) return ; postorderRecursive (node.left ); postorderRecursive (node.right ); console .log ('深度优先遍历,左 → 右 → 根:' , node.val ); } postorderRecursive (root);
广度优先遍历,层序遍历(Level-order):一层一层从左到右 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 function levelOrderTraversal (node ) { if (!node) return ; const queue = [node]; while (queue.length ) { const current = queue.shift (); console .log ('广度优先遍历, 层序遍历' , current.val ); if (current.left ) queue.push (current.left ); if (current.right ) queue.push (current.right ); } } levelOrderTraversal (root);
二叉树应用 前序遍历 DOM 1 2 3 4 5 6 7 8 function traverseDOM (node ) { if (!node) return ; console .log (node.tagName ); for (const child of node.children ) { traverseDOM (child); } } traverseDOM (document .body );
虚拟 DOM diff 使用后序遍历(自底向上)进行比较,便于复用
可视化组件(树结构 UI) 文件夹结构、组织架构图、流程图等
1 2 3 4 5 6 7 8 9 10 11 12 13 function renderTree (node ) { if (!node) return '' ; return ` <div class="tree-node"> ${node.name} <div class="children"> ${renderTree(node.left)} ${renderTree(node.right)} </div> </div> ` ;}
前端路由或菜单生成 从嵌套路由或后台返回的菜单结构,生成平面结构或 DOM 元素,也常用树遍历实现。
1 2 3 4 5 6 7 8 9 10 11 12 function flatRoutes (tree ) { const result = []; function dfs (node, path = '' ) { const fullPath = `${path} /${node.path} ` ; result.push (fullPath); if (node.children ) { for (const child of node.children ) dfs (child, fullPath); } } dfs (tree); return result; }