先序遍历和后序遍历区别和代码实现
过程都一样,都是自上而下,自左向右一一遍历,不同的是先序遍历求的是儿子,后序遍历求的是老子
先序遍历:从上往下,从左至右,依次遍历
中序遍历,可以把每个节点看作数学中的括号,然后是左节点,节点,右节点
后序遍历:从下往上,自左向右遍历。
代码实现:
package sort; import java.util.LinkedList; public class pre_mid_after_sort { public static int[] array = new int[]{1,2,3,4,5,6,7,8,9,10}; public static void main(String[] args) { LinkedList<Node> node = createNode(array); Node node1 = node.get(0); preNode(node1); } /** * 内部类: * 方法内部类,就是类中的方法还有一个类 */ private static class Node{ int data; Node letfNode; Node rightNode; public Node(int data) { this.data = data; this.letfNode =null; this.rightNode = null; } } public static LinkedList<Node> createNode(int[] array){ //添加元素 final LinkedList<Node> nodes = new LinkedList<>(); for (int i = 0; i < array.length; i++) { nodes.add(new Node(array[i])); } //将各个节点指针对应一下 for (int index = 0; index < nodes.size()/2 - 1; index++) { nodes.get(index).letfNode = nodes.get(index * 2 + 1); nodes.get(index).rightNode = nodes.get((index * 2 + 2)); } nodes.get(nodes.size()/2 - 1).letfNode = nodes.get(nodes.size() - 1); if(nodes.size()%2 == 1) nodes.get(nodes.size()/2 - 1).rightNode = nodes.get(nodes.size() - 1); return nodes; } public static void preNode(Node node){ if(node == null ) return; System.out.println(node+" "); preNode(node.letfNode); preNode(node.rightNode); } public static void midNode(Node node){ if(node == null) return; midNode(node.letfNode); System.out.println(node+" "); midNode(node.rightNode); } public static void afterNode(Node node){ if(node == null) return; afterNode(node.letfNode); afterNode(node.rightNode); System.out.println(node+" "); } }