- 1 /*
- 2 * @Description:
- 3 * @Version: 1.0
- 4 * @Autor: longbs
- 5 */
- 6 class Node {
- 7 constructor (data = '#') {
- 8 this.data = data
- 9 this.lNode = null
- 10 this.rNode = null
- 11 }
- 12 }
- 13
- 14 class BiTree {
- 15 root = null
- 16 nodeList = []
- 17 constructor (nodeList) {
- 18 this.root = new Node()
- 19 this.nodeList = nodeList
- 20 }
- 21 createNode (node) {
- 22 const data = this.nodeList.shift()
- 23 if (data === '#') return
- 24 node.data = data
- 25 // 下一个元素是不是空节点, 如果不是创建左节点
- 26 if (this.nodeList[0] !== '#') {
- 27 node.lNode = new Node(data)
- 28 }
- 29 this.createNode(node.lNode)
- 30
- 31 // 下一个元素是不是空节点, 如果不是创建右节点
- 32 if (this.nodeList[0] !== '#') {
- 33 node.rNode = new Node(data)
- 34 }
- 35 this.createNode(node.rNode)
- 36
- 37 }
- 38 preorderTraverse (node) {
- 39 if (node === null) return
- 40 console.log(node.data)
- 41 this.preorderTraverse(node.lNode)
- 42 this.preorderTraverse(node.rNode)
- 43 }
- 44 inorderTraverse (node) {
- 45 if (node === null) return
- 46 this.inorderTraverse(node.lNode)
- 47 console.log(node.data)
- 48 this.inorderTraverse(node.rNode)
- 49 }
- 50 postorderTraverse (node) {
- 51 if (node === null) return
- 52 this.postorderTraverse(node.lNode)
- 53 this.postorderTraverse(node.rNode)
- 54 console.log(node.data)
- 55 }
- 56 sequenceTraverse (root) {
- 57 if (!root) return
- 58 let queue = []
- 59 queue.push(root)
- 60 while (queue.length) {
- 61 const node = queue.shift()
- 62 console.log(node.data)
- 63 if(node.lNode) {
- 64 queue.push(node.lNode)
- 65 }
- 66 if (node.rNode) {
- 67 queue.push(node.rNode)
- 68 }
- 69 }
- 70 }
- 71 }
- 72
- 73 let arr = ['A','B','D','#','#','E','#','#','C','F','#', '#', 'G', '#', '#']
- 74 let bi = new BiTree(arr)
- 75 bi.createNode(bi.root)
- 76 console.log(bi.root)
- 77
- 78 console.log('----先序----')
- 79 console.log(bi.preorderTraverse(bi.root))
- 80
- 81 console.log('----中序----')
- 82 console.log(bi.inorderTraverse(bi.root))
- 83
- 84 console.log('----后序----')
- 85 console.log(bi.postorderTraverse(bi.root))
- 86
- 87 console.log('----层序----')
- 88 console.log(bi.sequenceTraverse(bi.root))
二叉树的递归遍历非常容易理解,但因为是递归调用需要在内存栈中分配内存用来保存参数,层数多了内存容易溢出。
非递归先序基本思路:使用数组来模拟栈的数据结构,首先根节点入栈,然后出栈,在出栈的时候把相关需要的节点按要求把左右节点入栈,如此循环一直到这个栈为空。
步骤:
- 根节点放入栈
- 取出栈顶的节点,把该节点结果放入数组
- 如果该右节点存在,将该节点右节点放入栈
- 如果该左节点存在,将该节点左节点放入栈
- 重复 2-4
- 栈为空退出循环