美文网首页
非递归遍历树

非递归遍历树

作者: Haward_ | 来源:发表于2019-10-17 10:58 被阅读0次
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Scanner;
import java.util.LinkedList;

public class MainTra {
  public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    String str = sc.nextLine();
    int[] arr = Arrays.stream(str.split(" ")).mapToInt(Integer::valueOf).toArray();

    Solution so = new Solution();
    TreeNode root = so.creatTree(arr,0);
    ArrayList<Integer> res = so.postTraver(root);
    for(int i=0;i<res.size();i++) {
      System.out.print(res.get(i)+" ");
    }
    System.out.println(System.lineSeparator());
  }
}
/****
 *  思想:构建树的时候,加入isVisit属性,全部默认为false;
 *  先添加root节点进栈;
 *  执行while循环:(1)弹出栈顶节点node;(2)如果visit==true;则添加进入结果,回到while循环;
 *  否则,增加入栈,遵循返过来的顺序和判空,当前节点的visit赋予true。
 */
class Solution {
  // 先序遍历
  public ArrayList<Integer> preTraver(TreeNode root) {
    ArrayList<Integer> res = new ArrayList<>();
    LinkedList<TreeNode> stack = new LinkedList<>();
    stack.add(root);
    while(stack.size()>0) {
      TreeNode node = stack.pollLast();
      if(node.isVisit) {
        res.add(node.val);
      }else { //=============================preTraver(模板,唯一差别部分)======
        // 先序遍历(根左右)进栈:右左根的非空元素依次进去
        if(node.right!=null) {
          stack.add(node.right);
        }
        if(node.left!=null) {
          stack.add(node.left);
        }
        node.isVisit = true;
        stack.add(node);
      }//==========================================================================
    }
    return res;
  }
  // 中序遍历
  public ArrayList<Integer> inTraver(TreeNode root) {
    ArrayList<Integer> res = new ArrayList<>();
    LinkedList<TreeNode> stack = new LinkedList<>();
    stack.add(root);
    while(stack.size()>0) {
      TreeNode node = stack.pollLast();
      if(node.isVisit) {
        res.add(node.val);
      }else {
        // 中序遍历(左根右)进栈:右根左的非空元素依次进去
        if(node.right!=null) {
          stack.add(node.right);
        }
        node.isVisit = true;
        stack.add(node);
        if(node.left!=null) {
          stack.add(node.left);
        }
      }
    }
    return res;
  }
  // 后序遍历
  public ArrayList<Integer> postTraver(TreeNode root) {
    ArrayList<Integer> res = new ArrayList<>();
    LinkedList<TreeNode> stack = new LinkedList<>();
    stack.add(root);
    while(stack.size()>0) {
      TreeNode node = stack.pollLast();
      if(node.isVisit) {
        res.add(node.val);
      }else {
        // 后序遍历(左右根)进栈:根右左的非空元素依次进去
        node.isVisit = true;
        stack.add(node);
        if(node.right!=null) {
          stack.add(node.right);
        }
        if(node.left!=null) {
          stack.add(node.left);
        }
      }
    }
    return res;
  }
  // 构建树
  public TreeNode creatTree(int[] arr,int i) {
    if(i>=arr.length) {
      return null;
    }
    TreeNode root = new TreeNode(arr[i]);
    root.left = creatTree(arr,2*i+1);
    root.right = creatTree(arr,2*i+2);
    return root;
  }

}

class TreeNode {
  int val;
  TreeNode left;
  TreeNode right;
  boolean isVisit;

  public TreeNode(int val) {
    this.val = val;
  }
}

相关文章

  • 树的遍历算法

    树的递归遍历 树的层次遍历 树的非递归前序遍历 树的非递归中序遍历

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

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

  • 二叉树遍历

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

  • 总结

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

  • 二叉树遍历

    先序遍历——[递归、非递归] 中序遍历——[递归、非递归] 后序遍历——[递归、非递归] 层次遍历——[递归、非递归]

  • 二叉树,非递归法

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

  • 二叉树遍历

    请递归,非递归方式分别前序遍历,中序遍历,后续遍历二叉树

  • 二叉树的相关操作(一)

    上次写了二叉树遍历,其中在非递归的遍历中,只写了前序遍历,没有写非递归中序遍历和后续遍历。非递归要用到栈,只要根据...

  • 二叉树遍历-JAVA实现

    基础二叉树 二叉树遍历分为前序、中序、后序递归和非递归遍历、还有层序遍历。 前序递归遍历算法:访问根结点-->递归...

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

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

网友评论

      本文标题:非递归遍历树

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