美文网首页
二叉树前序中序遍历

二叉树前序中序遍历

作者: 巡山的小猴子 | 来源:发表于2019-06-28 12:29 被阅读0次
     1
    / \
   2   3
  / \   \
 4   5   6
    / \  
   7   8
  • 前序遍历:1 2 4 5 7 8 3 6 根左右
  • 中序遍历:4 2 7 5 8 1 3 6 左根右
  • 后序遍历:4 7 8 5 2 6 3 1 左右根

建树代码

class Node {
    int value;
    Node left;
    Node right;
    public Node(int value) {
        this.value = value;
    }
    public void conect(Node left,Node right) {
        this.left = left;
        this.right = right;
    }
    @Override
    public String toString() {
        return value+"";
    }
}


public class Tree {
    public static Node create() {
        Map<Integer,Node> nodeMap = new HashMap<Integer,Node>();
        for (int i = 1; i < 9; i++) {
            Node node = new Node(i);
            nodeMap.put(i, node);
        }
        nodeMap.get(1).conect(nodeMap.get(2), nodeMap.get(3));
        nodeMap.get(2).conect(nodeMap.get(4), nodeMap.get(5));
        nodeMap.get(3).conect(null, nodeMap.get(6));
        nodeMap.get(4).conect(null, null);
        nodeMap.get(5).conect(nodeMap.get(7), nodeMap.get(8));
        nodeMap.get(6).conect(null,null);
        nodeMap.get(7).conect(null,null);
        nodeMap.get(8).conect(null,null);
        return nodeMap.get(1);
    }
}

前序递归遍历

  1. 前序遍历根左右,递归访问跟二叉树的定义有关:null也是节点,所以叶子节点,被认为是一种特殊子树(两边null)的根节点。
          4
         / \
      null  null  

  1. 然后只是打印每个子树的根节点,就实现了前序遍历。
递归思路如下:
  1. 递归的出口被设计成: 如果子树的根节点是null,那么就不用遍历,什么都不做返回
  2. .每次打印根节点
    public static void recursiveDLR(Node root) {
        if(root != null) {
            System.out.print(root.value + " ");
            recursiveDLR(root.left);
            recursiveDLR(root.right);
        }
    }
从递归方法找非递归的方法:
  1. 如果把递归拆开,每一层都用隐式栈记录了这一层的右子树的根节点,如本树:第一层3进栈,第二层5进栈

  2. 前序遍历会优先打印左边的一树枝,右边都是进栈的货,最初进栈的是紧挨着左边树枝的平行左树枝

             1
            / 
          2   
         /   
        4 
  1. 非递归完全由递归幻化而来,每次循环都是面向一个小子树,打印他的根节点,然后先入右再如左,让左做栈顶,下次循环就是左做根的小子树
    public static void notRecursiveDLR(Node root) {
        Stack<Node> stack = new Stack<Node>();
        stack.push(root);
        while(!stack.isEmpty()) {
            Node thisRoot = stack.pop();
            System.out.print(thisRoot + " ");
            if(thisRoot.right != null) {
                stack.push(thisRoot.right);
            }
            if(thisRoot.left != null) {
                stack.push(thisRoot.left);
            }
        }
    }

中序遍历

递归思路
  1. 跟前序一样还是打印根节点,最左边的叶子其实也可以看成是特殊子树的根节点
    public static void recursiveLDR(Node root) {
        if(root != null) {
            recursiveLDR(root.left);
            System.out.print(root.value + " ");
            recursiveLDR(root.right);
        }
    }
非递归的思路
  1. if中是递归子树,每次入参都是一个小子树的根节点,然后一直扎到最左边的叶子节点的null,

  2. else中起到的是转换方向的作用,相当于给上边的if传入下一个小树的根节点

  3. 可以看到,中序遍历是顺序,最左边的小子树,它紧挨着的右边的小子树,然后向上返

  4. 每次打印的也是根节点

              1
             / \
            2   3
           / \   \
          4   5   6
             / \  
            7   8
    public static void notRecursiveLDR(Node root) {
        Stack<Node> stack = new Stack<Node>();
        Node thisNode = root;
        while(!stack.isEmpty() || thisNode != null) {
            //递归子树
            if(thisNode != null) {
                stack.push(thisNode);
                thisNode = thisNode.left;
            }else{//打印根节点,递归右子树,每次递归其实都是先找左到叶子的左null节点,
                  //然后栈顶就是最左边的叶子节点了,
                  //也就是最左子树的根节点,其实也是打印根节点           
                Node treeNode = stack.pop();
                System.out.print(treeNode + " ");
                thisNode = treeNode.right;
            }

        }
    }

相关文章

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

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

  • goLang 二叉树遍历(递归 非递归 前序遍历 中序遍历 后序

    goLang 二叉树遍历(递归 非递归 前序遍历 中序遍历 后序遍历 层序遍历) 前序遍历 中序遍历 后序遍历 代...

  • leetcode 144 145 94

    二叉树遍历 前序遍历 中序遍历 后序遍历

  • 二叉树的遍历

    二叉树的遍历 前序遍历 访问根结点 前序遍历左子树 前序遍历右子树 总结:根左右 中序遍历 中序遍历左子树 访问根...

  • 二叉树的遍历

    二叉树的遍历 二叉树遍历 分为前序遍历、中序遍历和后序遍历。 前序遍历 (DLR) 先访问根节点,然后前序遍历左子...

  • 二叉树三种遍历Swift代码实现

    二叉树的三种遍历 二叉树 前序遍历 中序遍历 后序遍历 另外 不得不说,得到二叉树的前序遍历和中序遍历的结果或者后...

  • 数据结构:树的实现和遍历(c++)

    (一)二叉树的遍历——递归实现 二叉树常见的遍历方式分为前序遍历、中序遍历和后序遍历。 1 前序遍历 前序遍历也叫...

  • 算法-01

    一、二叉树 1、前序遍历:先访问根节点、前序遍历左子树、前序遍历右子树 2、中序遍历:先访问中序遍历左子树、根节点...

  • 二叉树递归与非递归 - 代码实现

    前序遍历,中序遍历,后序遍历,层次遍历,深度遍历 参考深度遍历 本质上就是 前序遍历 C++ 实现 二叉树前序、中...

  • 面试题7-二叉树重构建

    题目要求 输入二叉树的前序遍历和中序遍历结果,重建二叉树,假设前序和中序遍历中都不含有重复的数字, 例如输入的前序...

网友评论

      本文标题:二叉树前序中序遍历

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