深度优先遍历1)前序遍历的递归实现:constpreOrder=(root)=>{letresult=[];consttraverseNode=(node)=>{if(node){//第一个根节点result.push(node.val);//然后遍历左子树traverseNode(node.left);//遍历右子树traverseNode(node.right);}}遍历节点(根);returnresult;}非递归实现:constpreOrder=(root)=>{letlist=[];让堆栈=[];//当根节点不为空时,将根节点压入栈中if(root!=null)stack.push(root);while(stack.length>0){root=stack.pop();//先访问根节点list.push(root.val);//我们先打印左子树,再打印右子树//所以先压入栈的是右子树,然后是左子树if(root.right!=null)stack.push(root.right);如果(root.left!=null)stack.push(root.left);}returnlist;}2)中序遍历的递归实现:constinOrder=(root)=>{letresult=[];consttraverseNode=(node)=>{if(node){//先遍历左子树traverseNode(node.left);//然后是根节点result.push(node.val);//然后遍历右子树traverseNode(node.right);}}遍历节点(根);返回rnresult;}非递归实现:constinOrder=(root)=>{letlist=[];让堆栈=[];while(stack.length>0||root!=null){if(root!=null){//如果当前节点不为空,则将当前节点入栈stack.push(root);//将指针移动到当前节点的左节点root=root.left;}else{//当前节点为空,则从栈顶弹出元素root=stack.pop();list.push(root.val);//将指针移动到右节点root=root.right;}}returnlist;}3)后序遍历的递归实现:constpostOrder=(root)=>{letresult=[];consttraverseNode=(node)=>{if(node){//先遍历左子树traverseNode(node.left);//然后遍历右子树traverseNode(node.right);//最后一个根节点result.push(node.val);}}遍历节点(根);returnresult;}非递归实现:constpostOrder=(root)=>{letlist=[];让堆栈=[];//当根节点不为空时,将根节点压入栈中if(root!=null)stack.push(root);while(stack.length>0){root=stack.pop();//由于后序遍历的输出顺序是:left=>right=>root//先把相加的结果倒序list.unshift(root.val);//然后然后让左子树先入栈,再入右子树//这样出栈顺序就变成先右后左if(root.left!=null)stack.push(root.left);如果(root.right!=null)stack.push(root.right);}returnlist;}广度优先遍历(层序遍历)非递归实现:constlevelOrder=(root)=>{letlist=[];让队列=[];如果(root!=null)queue.push(root);while(queue.length>0){letsize=queue.length;让温度=[];for(leti=0;i
