zoukankan      html  css  js  c++  java
  • 算法疑难(js实现)---9、二叉树的深度优先遍历

    算法疑难(js实现)---9、二叉树的深度优先遍历

    一、总结

    一句话总结:

    1、先序遍历:(根左右)
    2、中序遍历:(左根右)
    3、后序遍历:(左右根)
     1 1 2 先序遍历:(根左右)
     3 a、访问根节点(得到节点的值)
     4 b、递归的访问左子树
     5 c、递归的访问右子树
     6 
     7 2 8 中序遍历:(左根右)
     9 a、递归的访问左子树
    10 b、访问根节点(得到节点的值)
    11 c、递归的访问右子树
    12 
    13 314 后序遍历:(左右根)
    15 a、递归的访问左子树
    16 b、递归的访问右子树
    17 c、访问根节点(得到节点的值)
    18 
    19 //1、先序遍历二叉树
    20 function preOrderTraversal(tree,ans){
    21     //递归的终止条件:叶子节点
    22     //递归的递推表达式:根左右
    23     //递归的返回值:不需要
    24 
    25     //如果不是叶子节点,就递归的访问左右子树
    26     if(tree){
    27         //a、访问根节点(得到节点的值)
    28         //console.log(tree.val);
    29         ans.push(tree.val);
    30         //b、递归的访问左子树
    31         preOrderTraversal(tree.left,ans);
    32         //c、递归的访问右子树
    33         preOrderTraversal(tree.right,ans);
    34     }else{
    35         //console.log('#');
    36         ans.push('#');
    37     }
    38 }
    39 let ans=[];
    40 preOrderTraversal(tree,ans);
    41 console.log(ans);
    42 
    43 //2、中序遍历二叉树
    44 function inOrderTraversal(tree,ans){
    45     if(tree){
    46         //a、递归的访问左子树
    47         inOrderTraversal(tree.left,ans);
    48         //b、访问根节点(得到节点的值)
    49         ans.push(tree.val);
    50         //c、递归的访问右子树
    51         inOrderTraversal(tree.right,ans);
    52     }else{
    53         ans.push('#');
    54     }
    55 }
    56 
    57 //3、后序遍历二叉树
    58 function postOrderTraversal(tree,ans){
    59     if(tree){
    60         //a、递归的访问左子树
    61         postOrderTraversal(tree.left,ans);
    62         //b、递归的访问右子树
    63         postOrderTraversal(tree.right,ans);
    64         //c、访问根节点(得到节点的值)
    65         ans.push(tree.val);
    66     }else{
    67         ans.push('#');
    68     }
    69 }

    二、二叉树的深度优先遍历

    博客对应课程的视频位置:9、二叉树的深度优先遍历
    https://www.fanrenyi.com/video/20/245

      1 <!DOCTYPE html>
      2 <html lang="en">
      3 <head>
      4     <meta charset="UTF-8">
      5     <title>二叉树的深度优先遍历</title>
      6 </head>
      7 <body>
      8 <!--
      9 需求:
     10 先序、中序、后序三种方式遍历二叉树
     11                 a
     12             b       c
     13          d     #  #    e
     14        #   f         #    #
     15          #   #
     16 
     17 先序遍历序列:['a','b','d','#','f','#','#','#','c','#','e','#','#']
     18 中序遍历序列:["#","d","#","f","#","b","#","a","#","c","#","e","#"]
     19 后序遍历序列:["#","#","#","f","d","#","b","#","#","#","e","c","a"]
     20 
     21 算法:
     22 递归
     23 
     24 1、
     25 先序遍历:(根左右)
     26 a、访问根节点(得到节点的值)
     27 b、递归的访问左子树
     28 c、递归的访问右子树
     29 
     30 2、
     31 中序遍历:(左根右)
     32 a、递归的访问左子树
     33 b、访问根节点(得到节点的值)
     34 c、递归的访问右子树
     35 
     36 3、
     37 后序遍历:(左右根)
     38 a、递归的访问左子树
     39 b、递归的访问右子树
     40 c、访问根节点(得到节点的值)
     41 
     42 -->
     43 <script>
     44     function TreeNode(val){
     45         this.val=val;
     46         this.left=null;
     47         this.right=null;
     48     }
     49 
     50     //根据二叉树的层次遍历的序列结果,创建二叉树
     51     function createTree_levelOrder(levelOrderArr) {
     52         let queue=[];
     53         let root=null;
     54 
     55         if(levelOrderArr[0]!==undefined){
     56             //1、找到根节点,将根节点加入到队列(层次遍历结果序列的第一个一定是根节点)
     57             let nodeVal=levelOrderArr.shift();
     58             root=new TreeNode(nodeVal);
     59             queue.push(root);
     60 
     61             //2、循环的将队列队首的元素出队,把和出队元素相关的元素加入到队列(循环中的元素为空,循环就运行完了)
     62 
     63             //队列不为空
     64             while(queue.length){
     65                 //1、将队列队首的元素出队(要么是整棵树的根节点、要么是子树的根节点)
     66                 let head= queue.shift();
     67                 //2、把和出队元素相关的元素加入到队列(先创建节点,根节点的左右孩子)
     68                 //a、创建左节点,将它加入到队列
     69                 nodeVal=levelOrderArr.shift();
     70                 if(nodeVal!='#'){
     71                     head.left=new TreeNode(nodeVal);
     72                     queue.push(head.left);
     73                 }
     74 
     75                 //b、创建右节点,将它加入到队列
     76                 nodeVal=levelOrderArr.shift();
     77                 if(nodeVal!='#'){
     78                     head.right=new TreeNode(nodeVal);
     79                     queue.push(head.right);
     80                 }
     81             }
     82         }
     83 
     84         return root;
     85     }
     86     let levelOrderArr=['a','b','c','d','#','#','e','#','f','#','#','#','#'];
     87     let tree=createTree_levelOrder(levelOrderArr);
     88     console.log(tree);
     89 
     90     // //1、先序遍历二叉树
     91     // function preOrderTraversal(tree,ans){
     92     //     //递归的终止条件:叶子节点
     93     //     //递归的递推表达式:根左右
     94     //     //递归的返回值:不需要
     95     //
     96     //     //如果不是叶子节点,就递归的访问左右子树
     97     //     if(tree){
     98     //         //a、访问根节点(得到节点的值)
     99     //         //console.log(tree.val);
    100     //         ans.push(tree.val);
    101     //         //b、递归的访问左子树
    102     //         preOrderTraversal(tree.left,ans);
    103     //         //c、递归的访问右子树
    104     //         preOrderTraversal(tree.right,ans);
    105     //     }else{
    106     //         //console.log('#');
    107     //         ans.push('#');
    108     //     }
    109     // }
    110     // let ans=[];
    111     // preOrderTraversal(tree,ans);
    112     // console.log(ans);
    113 
    114     // //2、中序遍历二叉树
    115     // function inOrderTraversal(tree,ans){
    116     //     if(tree){
    117     //         //a、递归的访问左子树
    118     //         inOrderTraversal(tree.left,ans);
    119     //         //b、访问根节点(得到节点的值)
    120     //         ans.push(tree.val);
    121     //         //c、递归的访问右子树
    122     //         inOrderTraversal(tree.right,ans);
    123     //     }else{
    124     //         ans.push('#');
    125     //     }
    126     // }
    127     // let ans=[];
    128     // inOrderTraversal(tree,ans);
    129     // console.log(ans);
    130 
    131     //3、后序遍历二叉树
    132     function postOrderTraversal(tree,ans){
    133         if(tree){
    134             //a、递归的访问左子树
    135             postOrderTraversal(tree.left,ans);
    136             //b、递归的访问右子树
    137             postOrderTraversal(tree.right,ans);
    138             //c、访问根节点(得到节点的值)
    139             ans.push(tree.val);
    140         }else{
    141             ans.push('#');
    142         }
    143     }
    144     let ans=[];
    145     postOrderTraversal(tree,ans);
    146     console.log(ans);
    147 
    148 </script>
    149 </body>
    150 </html>

     
  • 相关阅读:
    Java——数组
    Java——控制循环结构
    脏检查
    Session跟SessionFactory的线程安全与非安全
    脏检查and刷新机构
    oracle函数
    多线程下单列模式
    多线程
    线程同步
    文件上传功能的实现
  • 原文地址:https://www.cnblogs.com/Renyi-Fan/p/12944547.html
Copyright © 2011-2022 走看看