深度遍历(DFS)

  1. // 递归的方式
  2. function DFS(root) {
  3. let res = []
  4. if (root === null) return []
  5. root.left && res.push(...DFS(root.left))
  6. root.right && res.push(...DFS(root.right))
  7. return res
  8. }
  9. // 非递归方式
  10. function DFS(root) {
  11. if (root === null) return []
  12. var res = []
  13. var stack = []
  14. stack.push(root);
  15. while(stack.length) {
  16. var item = stack.pop();
  17. res.push(item)
  18. if (item.left) stack.push(item.right) // 先放右边再放左边,这样一会pop会先出left
  19. if (item.left) stack.push(item.left) //
  20. }
  21. return res
  22. }

广度遍历(BFS)

  1. let result = [];
  2. let stack = [tree]; // 先将要遍历的树压入栈
  3. let count = 0; // 用来记录执行到第一层
  4. function bfs (root) {
  5. let node = stack[count]
  6. if (node) {
  7. result.push(node)
  8. if(node.left) stack.push(node.left);
  9. if(node.right) stack.push(node.right);
  10. count++
  11. bfs()
  12. }
  13. }
  14. bfs();
  15. // 非递归写法
  16. function bfs(node) {
  17. let res = []
  18. let queue = [node]
  19. let point = 0
  20. while (point < queue.length) {
  21. let item = queue[point++]
  22. res.push(item)
  23. if (item.left) queue.push(item)
  24. if (item.right) queue.push(item)
  25. }
  26. return res
  27. }
  28. bfs(tree)