zoukankan      html  css  js  c++  java
  • 二叉树的前中后序遍历(递归+非递归)

    二叉树遍历:

    前序遍历:根节点->左儿子->右儿子

    中序遍历:左儿子->根节点->右儿子

    后序遍历:左儿子->右儿子->根节点

    例如给定一个树A

    前序遍历:[1,2,4,5,3,6]

    中序遍历:[4,2,5,1,6,3]

    后序遍历:[4,5,2,6,3,1]

    定义节点:

    class TreeNode{
        int val;
        TreeNode left;
        TreeNode right;
        TreeNode(){}
        TreeNode(int val){this.val = val;}
        TreeNode(int val, TreeNode left, TreeNode right){
            this.val = val;
            this.left = left;
            this.right = right;
        }
    }

    六种遍历方式:

    public class Solution {
        //递归遍历
    
        //前序遍历
        public void recurPreOrder(TreeNode node){
            if(node == null) return;
            System.out.print(node.val+"	");
            recurPreOrder(node.left);
            recurPreOrder(node.right);
        }
    
        //中序遍历
        public void recurInOrder(TreeNode node){
            if(node == null) return;
            recurInOrder(node.left);
            System.out.print(node.val+"	");
            recurInOrder(node.right);
        }
    
        //后序遍历
        public void recurPostOrder(TreeNode node){
            if(node == null) return;
            recurPostOrder(node.left);
            recurPostOrder(node.right);
            System.out.print(node.val+"	");
        }
    
    
        //非递归遍历
    
        //前序遍历
        public void PreOrder(TreeNode node){
            LinkedList<TreeNode> list = new LinkedList<>();//LinkedList模拟栈的先进后出
    
            while(node!=null||!list.isEmpty()){
                while(node!=null){
                    list.addFirst(node);
                    System.out.print(node.val +"	");
                    node = node.left;//遍历左子树
                }
                node = list.removeFirst();
                node = node.right;//出栈一个节点,找到其右儿子,返回上面的循环继续遍历右儿子的左子树
            }
        }
    
        //中序遍历
        public void InOrder(TreeNode node){
            LinkedList<TreeNode> list = new LinkedList<>();
            while(node!=null || !list.isEmpty()){
                while(node!=null){
                    list.addFirst(node);
                    node = node.left;
                }
                node = list.removeFirst();
                System.out.print(node.val+"	");
                node = node.right;
            }
        }
    
        //后序遍历
        public void PostOrder(TreeNode node){
            LinkedList<TreeNode> list = new LinkedList<>();
            LinkedList<TreeNode> tempList = new LinkedList<>();//临时栈
            while(node!=null || !tempList.isEmpty()){
                while(node!=null){
                    tempList.addFirst(node);
                    list.addFirst(node);
                    node = node.right;//后序遍历相当于前序遍历的逆序,所以先遍历右子树把节点存入两个栈
                }
                if(!tempList.isEmpty()){//当右子树没有右儿子时候,栈顶出栈,遍历左子树
                    node = tempList.removeFirst();
                    node = node.left;
                }
            }
            while(!list.isEmpty()){
                System.out.print(list.removeFirst().val+"	");
            }
        }
    }

    测试:

    @Test
        public void testTree(){
            TreeNode node6 = new TreeNode(6,null,null);
            TreeNode node5 = new TreeNode(5,null,null);
            TreeNode node4 = new TreeNode(4,null,null);
            TreeNode node3 = new TreeNode(3,node6,null);
            TreeNode node2 = new TreeNode(2,node4,node5);
            TreeNode node1 = new TreeNode(1,node2,node3);
    
            //先序遍历
            System.out.println("先序遍历");
            recurPreOrder(node1);
            System.out.println();
            PreOrder(node1);
            System.out.println();
    
            //中序遍历
            System.out.println("中序遍历");
            recurInOrder(node1);
            System.out.println();
            InOrder(node1);
            System.out.println();
    
            //后序遍历
            System.out.println("后序遍历");
            recurPostOrder(node1);
            System.out.println();
            PostOrder(node1);
            System.out.println();
    
        }

  • 相关阅读:
    奇怪的问题:Linux执行脚本碰到Permission denied问题(记录)
    MySQL中的显式锁---MySQL用户级锁函数
    使用Python的tenacity库实现异常重试机制
    json.net payload
    Eclipse Plugin
    MyEclipse web项目转换为eclipse web项目
    Nginx The system cannot find the path specified
    Spring Boot实战:静态资源无法访问
    WebService rwsp:NoRunningCommunicationPointAvailable
    Intellij IDEA 自动生成 serialVersionUID
  • 原文地址:https://www.cnblogs.com/codercql/p/14488870.html
Copyright © 2011-2022 走看看