首页 > 其他分享 >二叉树遍历(递归、迭代)

二叉树遍历(递归、迭代)

时间:2022-09-22 22:59:49浏览次数:58  
标签:遍历 return cur 迭代 res 二叉树 push root stack

前中后序遍历

  • 递归法

    //前序遍历
    var preorderTraversal = function(root) {
    let res=[];
    const dfs=function(root){
        if(root===null)return ;
        //先序遍历所以从父节点开始
        res.push(root.val);
        //递归左子树
        dfs(root.left);
        //递归右子树
        dfs(root.right);
    }
    //只使用一个参数 使用闭包进行存储结果
    dfs(root);
    return res;
    };
    //中序遍历
    var inorderTraversal = function(root) {
       let res=[];
       const dfs=function(root){
           if(root===null){
               return ;
          }
           dfs(root.left);
           res.push(root.val);
           dfs(root.right);
      }
       dfs(root);
       return res;
    };
    //后序遍历
    var postorderTraversal = function(root) {
       let res=[];
       const dfs=function(root){
           if(root===null){
               return ;
          }
           dfs(root.left);
           dfs(root.right);
           res.push(root.val);
      }
       dfs(root);
       return res;
    };

     

  • 迭代法

前序遍历:

// 入栈 右 -> 左
// 出栈 中 -> 左 -> 右
var preorderTraversal = function(root, res = []) {
   if(!root) return res;
   const stack = [root];
   let cur = null;
   while(stack.length) {
       cur = stack.pop();
       res.push(cur.val);
       cur.right && stack.push(cur.right);
       cur.left && stack.push(cur.left);
  }
   return res;
};

中序遍历:

// 入栈 左 -> 右
// 出栈 左 -> 中 -> 右

var inorderTraversal = function(root, res = []) {
   const stack = [];
   let cur = root;
   while(stack.length || cur) {
       if(cur) {
           stack.push(cur);
           // 左
           cur = cur.left;
      } else {
           // --> 弹出 中
           cur = stack.pop();
           res.push(cur.val);
           // 右
           cur = cur.right;
      }
  };
   return res;
};

详细版
   const res = []
   if (root === null) {
  return res
  }
   const stack = []
   let temp = root
   while (temp !== nul1){
       stack.push(temp)
       temp = temp. left
  }
   
   while (stack.length > 0) {
       const current = stack.pop()
       res.push(current.val)
       if ( current.right !== null) {
           let temp2 = current.right
           while (temp2 !== null) {
               stack.push(temp2)
               temp2 = temp2.left
          }
  }
  }
   return res


后序遍历:

// 入栈 左 -> 右
// 出栈 中 -> 右 -> 左 结果翻转

var postorderTraversal = function(root, res = []) {
   if (!root) return res;
   const stack = [root];
   let cur = null;
   do {
       cur = stack.pop();
       res.push(cur.val);
       cur.left && stack.push(cur.left);
       cur.right && stack.push(cur.right);
  } while(stack.length);
   return res.reverse();
};

1

标签:遍历,return,cur,迭代,res,二叉树,push,root,stack
From: https://www.cnblogs.com/user-yi/p/16721125.html

相关文章

  • 王道-考研-数据结构-线索二叉树
    线索二叉树的构造常用的是中序线索二叉树。寻找前驱结点:若左指针为线索,则其指向结点为前驱结点。若左指针为左孩子,则其左子树的最右侧结点为前驱结点。寻找后继结点......
  • BM31对称二叉树(判断二叉树是否symmetric?)(递归)
    描述给定一棵二叉树,判断其是否是自身的镜像(即:是否对称)例如:                 下面这棵二叉树是对称的下面这棵二叉树不对称。数据范围......
  • leetcode 105. Construct Binary Tree from Preorder and Inorder Traversal 从前序与
    一、题目大意给定两个整数数组preorder和inorder,其中preorder是二叉树的先序遍历,inorder是同一棵树的中序遍历,请构造二叉树并返回其根节点。示例1:输入:pre......
  • JAVA中容器设计的进化史:从白盒到黑盒,再到跻身为设计模式之一的迭代器
    大家好,又见面了。在我们的项目编码中,不可避免的会用到一些容器类,我们可以直接使用List、Map、Set、Array等类型。当然,为了体现业务层面的含义,我们也会根据实际需要自行封......
  • LoadRunner中Action的迭代次数的设置和运行场景中设置
    LoadRunner是怎么重复迭代和怎么增加并发运行的呢?另外,在参数化时,对于一次压力测试中均只能用一次的资源应该怎么参数化呢?就是说这些资源用了一次就不能在用了的。......
  • 对称二叉树
    对称二叉树一、题目描述给一个二叉树的根节点root,检查它是否为轴对称。实例输入:root=[1,2,2,3,4,4,3]输出:true输入:root=[1,2,2,null,3,null,3]输出:false二......
  • 代码笔记25 C++ OpenCV注意遍历cv::Mat格式中的数据格式
    1 用visualstudio做OpenCV的一些图像处理。不得不说,用起C++就怀念python,不止一次想放弃然后用python写,或许用g++和CMake会好点。在遍历cv::Mat中会使用mat.at<type>(in......
  • 产品版本号是如何确定的(产品迭代机制)
    2.3.9之后再改就是2.4.0?产品的版本号是如何确定的?什么时候会多加一个?每当一个产品更新是,你是否也有这样的疑问?本文作者依据工作中项目实践的所思所想,并结合案例等分享了产......
  • Java中如何遍历字符串呢?
    字符串是程序开发中我们见的最多的一种数据类型对字符串的操作,也是我们日常涉及的最多的一种操作方式,那么如何遍历字符串为字符并输出呢?下面笔者讲述三种操作方式,如下所......
  • 构造二叉树并输出层次遍历序列
    题目给定两个字符串,分别是二叉树的后序遍历和中序遍历,打印二叉树的层次遍历序列.思路构造出二叉树,然后层次遍历其实就是完全糅合二叉树构造和层次遍历两道题目lee......