二叉树三序遍历迭代+递归

161 阅读1分钟

1.二叉树的三种遍历方式讲解

节点数据结构

var node = function(root){
      
      val:root.val;
      left:node.left;
      right:node.right;
}

(1)先序遍历

 1,2,4,8,9,5,10,9,3,6,12,13,14,15
                     1
             2               3
        4        5      6        7
    8     9   10   11 12  13   14    15
    
下图是先序遍历方式

①递归方式

         function pre_traverse(root){
              if(root == null)
              return null;
              console.log(root.val);
              pre_traverse(root.left);
              pre_traverse(root.right);
              return 0;
         }

② N叉树递归

     function N_pre_traverse(root){
         var res = [];
         var a =  function recurive(root){
                  if(root == null)
                  return null;
                  res.push(root.val);
                  for(var i = 0 ; i < root.children.length ; i++)
                  {
                        recurive(root.children[i]);
                  }
             }(root)
        return res;
    }


②迭代入栈方式

    function pre_traverse(root){
              var res = [root];
              var output = [];
              while(res.length)
              {
                  var header = res.pop();
                  output.push(header.val)
                  if(header.right!=null)
                  res.push(header.right);
                  if(header.left!=null)
                  res.push(header.left);
              }
              console.log(output);
              return 0;
         }

(2)中序遍历

① 递归方式

             function mid_traverse(root){
              if(root == null)
              return null;
              mid_traverse(root.left);
              console.log(root.val);
              mid_traverse(root.right);
              return 0;
         }

② morris线索二叉树遍历

            function mid_traverse(root)
            {
                var pre = root;
                var cur = root;
                var output = [];
                while(cur)
                {
                       if(cur.left == null)
                    {
                       output.push(cur.val);
                        cur = cur.right;
                     }
                
                    else
                    {
                        pre = cur.left;
                        while(pre.right)
                        {
                            pre = pre.right;
                        }
                        pre.right = cur;
                        var temp = cur;
                        cur = cur.left;
                        temp.left = null;
                    }
                }
              
                return output;
            }

(3)后序遍历

① 递归

    function postorder_traversal(root)
    {
        if(root == null)
        return null;
        postorder_traversal(root.left)
        postorder_traversal(root.right)
        console.log(root.val)
        return 0;
    }
        

② N叉树递归

     function N_postorder_traverse(root){
         var res = [];
         var a =  function recurive(root){
                  if(root == null)
                  return null;
                  for(var i = 0 ; i < root.children.length ; i++)
                  {
                        recurive(root.children[i]);
                  }
                    res.push(root.val);
             }(root)
        return res;
    }

(4)层序遍历

① 二叉树BFS利用队列进行广搜迭代

 function Bitree_BFS(root) {
   var queue = [root];
   var output = [];
   while (queue.length) {
       var res = [];
       var len = queue.length;
       for (var i = 0; i < len; i++)
       {
           var node = queue.shift();
           res.push(node.val);
           if (node.left != null)
               queue.push(node.left);
           if (node.right != null)
               queue.push(node.right);
       }
       output.push(res)
      
   }

   return output;
}

② N叉树利用BFS层序遍历

var levelOrder = function (root){
   if(root == null)
   {
       return [];
   }
   var queue = [root];
   var output = [];
   while (queue.length) {
       var res = [];
       var len = queue.length;//获取每一层的长度
       for(var i = 0 ; i < len; i++)
       {
           var node = queue.shift();//截取头节点
           res.push(node.val);//将每一层的值存入数组
           queue.push(...node.children);//每次将一层所有的节点压入
       }
       output.push(res);
   }

   return output;
}

欢迎大佬批评指正!!!!