美文网首页
二叉树三种遍历的非递归思路(JAVASCRIPT)

二叉树三种遍历的非递归思路(JAVASCRIPT)

作者: 小豆soybean | 来源:发表于2018-08-14 18:16 被阅读0次

原文链接:https://blog.csdn.net/sinat_37059404/article/details/76199984
写的挺好啊。。个人觉得第二种if else的看的更清晰

二叉树在图论中是这样定义的:二叉树是一个连通的无环图,并且每一个顶点的度不大于3。有根二叉树还要满足根结点的度不大于2。有了根结点之后,每个顶点定义了唯一的父结点,和最多2个子结点。然而,没有足够的信息来区分左结点和右结点。如果不考虑连通性,允许图中有多个连通分量,这样的结构叫做森林。

这里,我使用javascript来写二叉树遍历的三种非递归方式,因为楼主学的是javascript,对于C,JAVA,C++这个都不是很熟,所以就只好使用javascript代替;

前序遍历

第一种方法:

var preorderTraversal = function(root) {
    var stack = [];
    var res = [];

    var p = root;
    if(root == null)return [];

    while(stack.length!=0 || p!=null){
//Side by side to join the array, and deposited in the stack, the future need to use these root nodes  into the right sub-tree
        while(p!=null){
            stack.push(p);
            res.push(p.val);
            p = p.left;
        }
      //  When p is empty, it means that both the root and the left subtree are traversed, and the right tree goes
        if(stack.length!=0){
            p = stack.pop();
            p = p.right;
        }

    }

    return res;
};

前序遍历第二种方法:

var preorderTraversal = function(root) {
  var result = [];
  var stack = [];
  var p = root;
  while(stack.length!=0 || p != null) {
      if(p != null) {
          stack.push(p);
          result.push(p.val); // Add before going to children
          p = p.left;
      } else {
          var node = stack.pop();
          p = node.right;
      }
  }
  return result;
};

中序遍历

第一种方法:

var inorderTraversal = function(root) {
  var stack = [];
  var res = [];
  var p = root;
  if(root == null) return [];

  while( stack.length!=0 || p!=null){

      while(p!=null){
          stack.push(p);
          p = p.left;
      }

      if(stack.length!=0){
          p= stack.pop();
          res.push(p.val);
          p = p.right;
      }
  }

  return res;
};

第二种方法:

var inorderTraversal = function(root) {
  var result = [];
  var stack = [];
  var p = root;
  while(stack.length!=0 || p != null) {
      if(p != null) {
      stack.push(p);
      p = p.left;
  } else {
      var node = stack.pop();
      result.push(node.val); // Add after all left children
      p = node.right;
  }
  }
  return result;
};

后序遍历

第一种方法:

var postorderTraversal = function(root) {
  var Stack = [];
    var result = [];

    if(root==null)
        return [];

    Stack.push(root);
    while(Stack.length!=0)
    {
      var node= Stack.pop();
        result.push(node.val);

        if(node.left)
        Stack.push(node.left);

        if(node.right)
        Stack.push(node.right);

    }
    return result.reverse();

};

第二种方法:

var postorderTraversal = function(root) {
  var result = [];
  var stack = [];
  var p = root;
  while(stack.length!=0 || p != null) {
     if(p != null) {
       stack.push(p);
       result.unshift(p.val); // Reverse the process of preorder
       p = p.right; // Reverse the process of preorder
     } 
     else {
       var node = stack.pop();
       p = node.left; // Reverse the process of preorder
      }
  }
  return result;

};

</article>

相关文章

  • LeetCode 二叉树的中序遍历(递归和非递归算法)

    二叉树的中序遍历给定一个二叉树,返回它的中序 遍历。示例: 非递归(思路更清晰): 非递归: 递归:

  • 二叉树的三种深度优先遍历算法与思路

    看了一些关于二叉树遍历算法的文章,例如:二叉树三种遍历方式的递归和循环实现二叉树的递归与非递归遍历(前序、中序、后...

  • 二叉树遍历java,非递归、层次。

    /** * 前序遍历 * 递归 */ /*** 前序遍历* 非递归*/ 后续遍历非递归 二叉树层次遍历基于java...

  • 二叉树

    二叉树遍历,非递归 思路 DFS的非递归实现本质上是在协调入栈、出栈和访问,三种操作的顺序。上述统一使得我们不再需...

  • 二叉树递归非递归遍历算法整理

    一、二叉树前序遍历 1 前序递归遍历 2.前序非递归遍历 一、二叉树中序遍历 2.中序递归遍历 1.中序非递归遍历...

  • 总结

    1、二叉树广度遍历(非递归) 广度遍历非递归实现需要依靠一个队列。 2、二叉树深度遍历(递归与非递归,前序,中序和...

  • 二叉树遍历

    二叉树的遍历 1. 前序遍历 1.1 递归前序遍历 1.2 非递归前序遍历 2 中序遍历 2.1递归遍历 2.2非...

  • 二叉树遍历

    关于二叉树的非递归的三种遍历要做到熟练。 总结三种非递归遍历方式 前序——中,左,右 1.将根节点直接入栈 访问栈...

  • 二叉树,非递归法

    递归法 二叉树的递归,有前序遍历、中序遍历、后序遍历,一般采用递归法,比较简单 非递归法 二叉树非递归法,采用栈来实现

  • 二叉树的遍历 递归 非递归 Java

    二叉树的常用遍历算法实现 前序遍历 递归实现 非递归实现(1)这个是常规思路,先遍历到根节点,并打印、压栈,然后遍...

网友评论

      本文标题:二叉树三种遍历的非递归思路(JAVASCRIPT)

      本文链接:https://www.haomeiwen.com/subject/hpavbftx.html