导致二叉树几乎是面试过程中必问的知识点。大部分描述过程都是用C、C++、JAVA、python等语言实现的,这里我们使用js语言来实现以下类似的功能。前端、nodejs方向、全栈方向的同学可以作为参考。示例以下所有实现均基于以下二叉树示例:如图所示,在创建过程中使用了binarytree库,代码如下:constBinaryTree=require('binarytree');letbinaryTree=newBinaryTree('F');让bNode=binaryTree.insert('B','left',binaryTree.root);让aNode=binaryTree.insert('A','left',bNode);让dNode=binaryTree.insert('D','right',bNode);letcNode=binaryTree.insert('C','left',dNode);leteNode=binaryTree.insert('E','right',dNode);让gNode=binaryTree.insert('G','right',binaryTree.root);让iNode=binaryTree.insert('I','right',gNode);让hNode=binaryTree.insert('H','左',iNode);DFS深度遍历有前序、中序和后序三种遍历方式。递归方法非常容易理解。代码如下:前序遍历:根节点--->左子树--->右子树functionpreorderDFS(root){constnodeList=[];预购(根,节点列表)返回节点列表;functionpreorder(root,nodeList){if(root!==null){nodeList.push(root.data)preorder(root.left,nodeList);预购(root.right,nodeList);}}}中序遍历:左子树--->根节点--->右子树函数inorderDFS(root){constnode列表=[];顺序(根,节点列表);返回节点列表;functioninorder(root,nodeList){if(root!==null){inorder(root.left,nodeList);节点列表。推送(根。数据);inorder(root.right,nodeList);}}}后序遍历:左子树--->右子树--->根节点函数postorderDFS(root){constnodeList=[];后序(根,节点列表);返回节点列表;functionpostorder(root,nodeList){if(root!==null){postorder(root.left,nodeList);后序(root.right,nodeList);节点列表。push(root.data)}}}}BFS可以分层遍历。需要一个队列。根节点首先加入队列执行出队操作。如果出队元素中有左孩子,则无所谓。如果队列中有右孩子,则无所谓。然后继续上面的操作,直到队列为空。函数BFS(root){constq=[root];const节点列表=[];while(q.length>0){constnode=q.流行音乐();节点列表。推送(节点。数据);if(node.left!==null)q.unshift(node.left);if(node.right!==null)q.unshift(node.right);}returnnodeList;}Snakeprint打印顺序类似BFS上一层首先打印的节点的子节点在下一层之后打印。按照这个思路,子节点需要存储在栈中。前后两层,左右孩子的打印顺序是相反的,所以我们需要两个杯子来实现,一个杯子按照先左后右的堆叠顺序存储奇数层节点child,另一个cup按照先Leftchild,后rightchild的堆叠顺序存储偶数层节点。假设lrStack存放奇数层节点,rlStack存放偶数层节点:根节点F为第一层,奇数层。所以lrStack输入FlrStack的所有元素,输出所有元素,即F输出。同时,因为下一层是偶数层,所以按照右孩子和左孩子的顺序,进入rlStackrlStack,输出所有元素B--->G,因为下一层是奇数层,所以进入lrStacklrStack,按照左孩子和右孩子的顺序输出所有元素I--->D--->A,因为下一层是偶数层,所以进入rlStackrlStack并按照右孩子和左孩子的顺序输出所有元素C--->E--->H,因为下一层已经没有数据了,结束按照思路,代码如下:函数printBintryTree(root){constlrStack=[];常量rlStack=[];lrStack.push(root);while(lrStack.length>0||rlStack.length>0){if(lrStack.length>0&&rlStack.length===0){while(lrStack.length>0){consttNode=lrStack.pop();控制台日志(tNode.data);如果(tNode.right!==null){rlStack.push(tNode.right);}if(tNode.left!==null){rlStack.push(tNode.left);}}}if(rlStack.length>0&&lrStack.length===0){while(rlStack.length>0){consttNode=rlStack.pop();console.log(tNode.data);if(tNode.left!==null){lrStack.push(tNode.left);}if(tNode.right!==null){lrStack.push(tNode.right);}}}}}示例调用//snakeprintprintBintryTree(binaryTree.root);//FBGIDACEH//广度遍历console.log(BFS(binaryTree.root));//['F','B','G','A','D','I','C','E','H']//深度遍历console.log(preorderDFS(binaryTree。根));//['F','B','A','D','C','E','G','I','H']console.log(inorderDFS(binaryTree.root));//['A','B','C','D','E','F','G','H','I']console.log(postorderDFS(binaryTree.root));//['A','C','E','D','B','H','I','G','F'];
