• 树的前序遍历、中序遍历、后序遍历,java实现


    1、三种遍历属于深度优先搜索(DFS所谓前中后其实是指遍历时每个节点被访问的相对顺序。

    前序遍历。节点→左孩子→右孩子  preorder

    中序遍历。左孩子→节点→右孩子   inorder

    后序遍历。左孩子→右孩子→节点  postorder

    2、宽度优先搜索(BFS)就是从上到下,从左到右一层一层一个一个的访问

    上图from leetcode

    这样记忆就会很方便。

    下面是代码:

    一、前序遍历,LinkedList既可以当成栈来使用,又可以当成队列来使用

    从根节点开始,每次迭代弹出当前栈顶元素,并将其孩子节点压入栈中,先压右孩子再压左孩子。输出【1,2,3,4,5】

    package helloworld;
    import java.util.LinkedList;
    
    class TreeNode{
        int val;
        TreeNode left;
        TreeNode right;
        TreeNode(int x){
            val=x;
        }
    }
    
    public class Helloworld{
        public LinkedList<Integer> preOrder(TreeNode root){
            LinkedList<TreeNode> stack = new LinkedList<>();
            LinkedList<Integer> output = new LinkedList<>();
            if (root == null) {
              return output;
            }
    
            stack.add(root);
            while (!stack.isEmpty()) {
              TreeNode node = stack.pollLast();
              output.add(node.val);
              if (node.right != null) {
                stack.add(node.right);
              }
              if (node.left != null) {
                stack.add(node.left);
              }
            }
            return output;
          }
        public static void main(String[] args) {
            Helloworld h=new Helloworld();
            TreeNode root = new TreeNode(1);
            root.left=new TreeNode(2);
            root.right=new TreeNode(5);
            root.left.left=new TreeNode(3);
            root.left.right=new TreeNode(4);
            
            System.out.println(h.preOrder(root));
    
        }
    
    }

    二、中序遍历,输出[3, 2, 4, 1, 5]

    方法1: 递归

    package helloworld;
    import java.util.ArrayList;
    import java.util.List;
    
    class TreeNode{
        int val;
        TreeNode left;
        TreeNode right;
        TreeNode(int x){
            val=x;
        }
    }
    
    public class Helloworld{
        public List <Integer> inOrder(TreeNode root){
            List < Integer > res = new ArrayList < > ();
            helper(root, res);
            return res;
        }
    
        public void helper(TreeNode root, List < Integer > res) {
            if (root != null) {
                if (root.left != null) {
                    helper(root.left, res);
                }
                res.add(root.val);
                if (root.right != null) {
                    helper(root.right, res);
                }
            }
     
             
          }
        public static void main(String[] args) {
            Helloworld h=new Helloworld();
            TreeNode root = new TreeNode(1);
            root.left=new TreeNode(2);
            root.right=new TreeNode(5);
            root.left.left=new TreeNode(3);
            root.left.right=new TreeNode(4);
            
            System.out.println(h.inOrder(root));
    
        }
    
    }

     方法2,基于栈遍历

    package helloworld;
    import java.util.*;
    
    class TreeNode{
        int val;
        TreeNode left;
        TreeNode right;
        TreeNode(int x){
            val=x;
        }
    }
    
    public class Helloworld{
        public List <Integer> inOrder(TreeNode root){
             List < Integer > res = new ArrayList < > ();
                Stack < TreeNode > stack = new Stack < > ();
                TreeNode curr = root;
                while (curr != null || !stack.isEmpty()) {
                    while (curr != null) {
                        stack.push(curr);
                        curr = curr.left;
                    }
                    curr = stack.pop();
                    res.add(curr.val);
                    curr = curr.right;
                }
                return res;
    
     
        }
     
        public static void main(String[] args) {
            Helloworld h=new Helloworld();
            TreeNode root = new TreeNode(1);
            root.left=new TreeNode(2);
            root.right=new TreeNode(5);
            root.left.left=new TreeNode(3);
            root.left.right=new TreeNode(4);
            
            System.out.println(h.inOrder(root));
    
        }
    
    }

    三、后序遍历,输出[3, 4, 2, 5, 1]

    package helloworld;
    import java.util.*;
    
    class TreeNode{
        int val;
        TreeNode left;
        TreeNode right;
        TreeNode(int x){
            val=x;
        }
    }
    
    public class Helloworld{
        public List <Integer> inOrder(TreeNode root){
            LinkedList<TreeNode> stack = new LinkedList<>();
            LinkedList<Integer> output = new LinkedList<>();
            if (root == null) {
              return output;
            }
    
            stack.add(root);
            while (!stack.isEmpty()) {
              TreeNode node = stack.pollLast();
              output.addFirst(node.val);
              if (node.left != null) {
                stack.add(node.left);
              }
              if (node.right != null) {
                stack.add(node.right);
              }
            }
            return output;
    
        }
     
        public static void main(String[] args) {
            Helloworld h=new Helloworld();
            TreeNode root = new TreeNode(1);
            root.left=new TreeNode(2);
            root.right=new TreeNode(5);
            root.left.left=new TreeNode(3);
            root.left.right=new TreeNode(4);
            
            System.out.println(h.inOrder(root));
    
        }
    
    }
  • 相关阅读:
    【MISC】ctf-想要种子吗?——jpg图片隐写
    【MISC】ctf-白哥的鸽子——jpg图片隐写
    关于MySQL递归查询,从子类ID查询所有父类
    关于lambdaQueryWrapper中常用方法
    Jmeter之正则表达式提取器+BeanShell断言--将返回结果导出到本地文件
    SQLMap开源渗透工具-SQLMap注入安全测试
    jmeter之配置元件-HTTP授权管理器(HTTP Authorization Manager)
    Jmeter实战大全(持续更新)
    Jmeter 之Ramp-up Period&固定定时器
    《从一万到一千万没有秘密》
  • 原文地址:https://www.cnblogs.com/TFYu/p/11275182.html
Copyright © 2020-2023  润新知