2020-12-09 二叉树的先中后序遍历

news/2024/7/5 4:58:28

递归版

先序遍历算法口诀

  • 访问根节点
  • 对左子树进行先序遍历
  • 对右子树进行先序遍历
const preorder = (root) => {
      if(!root) { return }
      console.log(root.val)
      preorder(root.left)
      preorder(root.right)
}

中序遍历算法口诀

  •  对根节点的子树进行中序遍历
  • 访问节点
  • 对跟几点的子树进行中序遍历
const inorder = (root) =>{
    if(!root) {return}
    inorder(roor.left)
    console.log(root.val)
    inorder(roor.right)

}

后序遍历算法口诀

  • 对根节点的左子树进行后序遍历
  • 对根节点的右子树进行后序遍历
  • 访问根节点
const postorder = ( root ) => {
   if(!root) { return}
   postorder(root.left)
   postorder(root.right)
   console.log(root.val)
} 

 

非递归版

 

先序遍历算法

  • 访问根节点
  • 对左子树进行先序遍历
  • 对右子树进行先序遍历
const preorder = (root) => {
     if(!root){ return}
     const stack = [root]// 栈
     while(stack.length){ 
        const n = stack.pop() // 出栈
        console.log(n)
        //  后进先出特性 所以先right 先入栈
        if(stack.right) stack.push(stack.right)
        if(stack.left) stack.push(stack.left)
     }
}

中序遍历

  •  对根节点的子树进行中序遍历
  • 访问节点
  • 对跟几点的子树进行中序遍历、
const inorder = (root) => {
      if(!root) { return}
      const stack = [] ;
      let p  = root ;  // 声明一个指针
      while(stack.length || p){ // stack 有值 或者 p 不为空 一直循环
         while(p){
            stack.push(p) // 入栈
            p = p.left ; // 指针指向左节点
         }
         const n = stack.pop() // 出栈
         console.log(n.val) // 访问根节点
         p = n.right // 指针指向右节点
      }
}

后序遍历算法口诀

  • 对根节点的左子树进行后序遍历
  • 对根节点的右子树进行后序遍历
  • 访问根节点
const postorder = ( root ) {
    if(!root) { rturn}
     const stack = [root] // 栈 
     const outputStack = [] // outputStack 栈  存储stack栈的反序
    while(stack.length) {
       const n  = stack.pop();  // 出栈 
       outputStack.push(n)  // 存档到outputStack栈中
       if(n.left) stack.push(n.left)
       if(n.left) stack.push(n.right)
    }
    while(outputStack.length){
         const n = outputStack.pop() // 从 outputStack  出栈
        console.log(n.val) // 访问节点
    }
}

 


http://www.niftyadmin.cn/n/3655827.html

相关文章

.Net程序开发中一个较为隐蔽的GDI泄露探析

最近一直在调试第三方委托开发的医疗输液系统(我接手时,代码已经完成,原则上我只修改接口部分以适应我们的硬件即可,不过调试过程中,该程序本身问题暴露不少),该系统用VB.net开发,该软件的图形界面是花费n多…

js --- 图的深度广度优先遍历

深度优先遍算法口诀 访问根节点对根节点的没有访问过的降临节点进行深度优先遍历 const graph {0:[1,2],1:[2],2:[0,3],3:[3] } const visited new Set() const dfs (n) >{console.log(n)visited.add(n)graph[n].forEach(c > {if (!visited.has(c)){dfs(c)}}); } dfs…

西门子Prodave5.5使用说明及VC示例

西门子PLC的通信协议主要是PPI、MPI、Profibus、CP243/CP343/CP443 网络协议,prodave是早期完成的程序接口,除了网络协议外其它的主要协议都支持,SoftNet是西门子最新推出的通信协议接口,稳定,并且大而全,目…

2020-12-18 js 实现堆

堆是什么? 堆是一种特殊的完全二叉树所有的节点都大于等于(最大堆)或小于等于(最小堆)它的子节点。 js 中的堆 js 中通常用数组表示堆左侧子节点的位置是 2 * index 1右侧子节点的位置是2* index 2父节点位置是&am…

VB实现SHELL扩展之接口参数获取失败探析

前几天有位网友问我用VB实现SHELL扩展的问题,这个问题比较有意思,虽然VB较少使用了,但是用VB开发COM组件还是比较方便的(前几天用EVC开发COM组件,相比起来,用VB还是比较幸福的),所以…

js 排序学习

冒泡排序 Array.prototype.bubbleSort function() {// console.log(this)for (let i 0; i < this.length - 1; i) {for(let j 0;j<this.length -1 - i; j1){ // -1 可以用j1来获取 - i是为了缩小循环节省时间if(this[j] > this[j1]){const temp this[j] // …

16进制字符串转数字(C/C++,VB/VB.net,C#)

这个问题看是很简单&#xff0c;但是在不同语言中实现的方式却千差万别&#xff0c;如果不知道方法&#xff0c;还真是麻烦&#xff0c;我就是在C#中遇到该问题&#xff0c;让我费了很大的周折&#xff0c;才在msdn查到。一、16进制字符串转数字1、C/CI、最简单的办法&#xff…

面试题 ---快速排序的空间复杂度是多少?时间复杂度的最好最坏的情况是多少,有哪些优化方案?

Array.prototype.quickSort function() {const rec (arr) >{if(arr.length 1){return arr}// 分别存放 前后的数组const left []const right []// 设置一个基准const mid arr[0]//进行分区for(let i 1; i<arr.length; i1){if(arr[i] < mid){left.push(arr[i])}el…