zoukankan      html  css  js  c++  java
  • 二叉树的先中后序遍历-JS非递归实现

     1 const bt = {
     2     val: 1,
     3     left: {
     4         val: 2,
     5         left: {
     6             val: 4,
     7             left: null,
     8             right: null,
     9         },
    10         right: {
    11             val: 5,
    12             left: null,
    13             right: null,
    14         },
    15     },
    16     right: {
    17         val: 3,
    18         left: {
    19             val: 6,
    20             left: null,
    21             right: null,
    22         },
    23         right: {
    24             val: 7,
    25             left: null,
    26             right: null,
    27         },
    28     },
    29 };
    30 
    31 //可以用堆栈来模拟递归
    32 
    33 //先序遍历
    34 const preorder = (root) => {
    35     if(!root) {return; }
    36     const stack = [root];  //创建一个栈
    37     while (stack.length) {
    38         const n = stack.pop();
    39         console.log(n.val);  
    40         if(n.right) stack.push(n.right); //根左右,栈是后进先出,所以先把右结点压栈
    41         if(n.left) stack.push(n.left);
    42     }
    43 }
    44 preorder(bt)
    45 
    46 //中序遍历
    47 const inorder = (root) => {
    48     if(!root) {return; }
    49     const stack = [];  //创建一个栈
    50     let p = root;
    51     while(stack.length || p) {
    52         while(p) {      
    53             stack.push(p); //左根右,遍历所以左结点压入栈中
    54             p = p.left;
    55         }
    56         const n = stack.pop();
    57         console.log(n.val); //弹出就是 左结点和中结点
    58         p = n.right; //把右结点压入,参与循环
    59     }
    60 }
    61 
    62 inorder(bt);
    63 
    64 //后序遍历
    65 const postorder = (root) => {    //后序遍历是左 右 根,先序遍历得到的是根 左 右
    66     if(!root) {return; }  // 把前序遍历的顺序调换一下得到 根 右 左,压栈再弹出就变成了 左 右  根
    67     const outputStack = [];
    68     const stack = [root];  //需要两个栈
    69     while (stack.length) {
    70         const n = stack.pop();
    71         outputStack.push(n);
    72         if(n.left) stack.push(n.left);
    73         if(n.right) stack.push(n.right);
    74     }
    75     while(outputStack.length) {  //倒叙输出即可
    76         const n = outputStack.pop();
    77         console.log(n.val);
    78     }
    79 }
    80 
    81 postorder(bt);
  • 相关阅读:
    bootstrap 导航栏、输入框按钮组、栅格系统
    Python排序算法冒泡排序选择排序插入排序
    Python 解螺旋数组
    初到博客园,请多指教
    gcd, map for ocaml
    qsort for ocaml
    子序列和最大的问题
    将一个整数划分为非负整数的部分
    filter in Ocaml
    scheme中表只能操作头部带来的一个问题
  • 原文地址:https://www.cnblogs.com/oaoa/p/14842902.html
Copyright © 2011-2022 走看看