什么是二叉树
任意节点的度不大于 2 的树是二叉树
二叉树创建
节点定义
|
|
粗暴创建
|
|
二叉树遍历
通过上面的创建,我们生成了如下的二叉树数据
|
|
前序遍历
中->左->右
递归
1 2 3 4 5 6 7 8 9
var preOrderRecurseStack = []; function preOrderRecurseTraverse(tree) { if (tree) { preOrderRecurseStack.push(tree.value); preOrderRecurseTraverse(tree.left); preOrderRecurseTraverse(tree.right); } }
非递归
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
var preOrderStack = []; function preOrderTraverse(tree) { var stack = []; var currentNode = tree; while (currentNode || stack.length > 0) { if (currentNode) { preOrderStack.push(currentNode.value); stack.push(currentNode); currentNode = currentNode.left; } else { var node = stack.pop(); currentNode = node.right; } } }
中序遍历
左->中->右
递归
1 2 3 4 5 6 7 8
var inOrderRecurseStack = []; function inOrderRecurseTraverse(tree) { if (tree) { inOrderRecurseTraverse(tree.left); inOrderRecurseStack.push(tree.value); inOrderRecurseTraverse(tree.right); } }
非递归
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
var inOrderStack = []; function inOrderTraverse(tree) { var stack = []; var currentNode = tree; while (currentNode || stack.length > 0) { if (currentNode) { stack.push(currentNode); currentNode = currentNode.left; } else { var node = stack.pop(); inOrderStack.push(node.value); currentNode = node.right; } } }
后序遍历
左->右->中
递归
1 2 3 4 5 6 7 8
var postOrderRecurseStack = []; function postOrderRecurseTraverse(tree) { if (tree) { postOrderRecurseTraverse(tree.left); postOrderRecurseTraverse(tree.right); postOrderRecurseStack.push(tree.value); } }
非递归
二叉树是对称的,所以正向的后序遍历和逆向的先序遍历是反过来的
|
|
广度优先遍历(层次遍历)
从左到右,一层一层
递归
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
function bfsRecurse(tree) { var bfsRecurseStack = [tree]; var bfsRecurseResult = []; var count = 0; (function inner() { var node = bfsRecurseStack[count]; if (node) { bfsRecurseResult.push(node.value); if (node.left) bfsRecurseStack.push(node.left); if (node.right) bfsRecurseStack.push(node.right); count++; inner(); } })(); return bfsRecurseResult; }
非递归
1 2 3 4 5 6 7 8 9 10 11 12 13
function bfs(tree) { var bfsStack = [tree]; var bfsResult = []; var count = 0; while (count < bfsStack.length) { var node = bfsStack[count++]; bfsResult.push(node.value); if (node.left) bfsStack.push(node.left); if (node.right) bfsStack.push(node.right); } return bfsResult; }
总结:
- 二叉树遍历递归实现比较好理解,但是性能不好(每次进入函数环境的消耗,栈消耗,不必要步骤的运行)
- 二叉树的非递归实现,也是利用栈(js 数组),是我们自己用逻辑控制的,性能更好