0 课程地址
https://coding.imooc.com/lesson/207.html#mid=13460
1 重点关注
1.1 什么是中序遍历和后续遍历
中序遍历:就是先遍历左节点,再遍历根节点,最后遍历右节点。
后序遍历:就是先遍历左节点,再遍历右节点,最后遍历根节点。
1.2 中序遍历和后续遍历的应用场景
中序遍历:由于具有从小到大排序的特性,多用于大小排序
后序遍历:从底层到顶层,层层遍历,多用于堆栈的打印。
2 课程内容
3 Coding
3.1 中序遍历和后续遍历
- 关键代码
/** * 5 二分搜索树,中序遍历 顾名思义,先遍历左节点,再遍历根节点,最后遍历右节点 * @author weidoudou * @date 2022/11/5 14:54 * @return null **/ public boolean inOrder(){ inOrder(root); return false; } //中序遍历 递归 private void inOrder(Node node){ //终止条件 if(node==null){ return; } //递归 inOrder(node.left); System.out.println(node.e);//1 inOrder(node.right); } /** * 6 二分搜索树,后序遍历 顾名思义,先遍历左节点,再遍历右节点,最后遍历根节点 * @author weidoudou * @date 2022/11/5 14:54 * @return null **/ public boolean postOrder(){ postOrder(root); return false; } //后序遍历 递归 private void postOrder(Node node){ //终止条件 if(node==null){ return; } //递归 postOrder(node.left); postOrder(node.right); System.out.println(node.e);//1 }
- 全量代码
package com.company; public class BST2<E extends Comparable> { //1 内部类 private class Node{ //二叉树特有属性 private Node left,right; private E e; private Node(E e){ this.e = e; this.left = null; this.right = null; } } private int size; private Node root; public BST2(){ this.size = 0; this.root = null; } /** * 定义基本方法 getSize * @author weidoudou * @date 2022/11/3 12:57 * @return int **/ public int getSize(){ return size; } /** *查询是否为空 * @author weidoudou * @date 2022/11/3 12:58 * @return boolean **/ public boolean isEmpty(){ return size == 0; } //2 循环添加元素,把null也看作节点 public void add(E e){ root = add(e,root); } //3 递归,添加元素 public Node add(E e,Node root){ //3.1 终止条件 if(root==null){ size++; return new Node(e); } //3.2 递归 //3.2.1 递归左孩子 if(e.compareTo(root.e)<0){ root.left = add(e,root.left); } //3.2.2 递归右孩子 if(e.compareTo(root.e)>0){ root.right = add(e,root.right); } //点睛之笔 return root; } /** * 二分搜索树 是否包含元素e * @author weidoudou * @date 2022/11/4 9:55 * @param e 请添加参数描述 * @return boolean **/ public boolean contains(E e){ return contains(e,root); } /** * 二分搜索树查询 递归 * @author weidoudou * @date 2022/11/4 9:57 * @param e 请添加参数描述 * @param node 请添加参数描述 * @return boolean **/ private boolean contains(E e,Node node){ //终止条件 if(node == null){ return false; } if(e.compareTo(node.e)==0){ return true; } //递归条件 if(e.compareTo(node.e)<0){ return contains(e,node.left); }else{ return contains(e,node.right); } } /** * 4 二分搜索树,前序遍历 顾名思义,先遍历根节点,再遍历左节点,最后遍历右节点 * @author weidoudou * @date 2022/11/5 14:54 * @return null **/ public boolean preOrder(){ preOrder(root); return false; } //前序遍历 递归 private void preOrder(Node node){ //终止条件 if(node==null){ return; } //递归 System.out.println(node.e);//1 preOrder(node.left); preOrder(node.right); } /** * 5 二分搜索树,中序遍历 顾名思义,先遍历左节点,再遍历根节点,最后遍历右节点 * @author weidoudou * @date 2022/11/5 14:54 * @return null **/ public boolean inOrder(){ inOrder(root); return false; } //中序遍历 递归 private void inOrder(Node node){ //终止条件 if(node==null){ return; } //递归 inOrder(node.left); System.out.println(node.e);//1 inOrder(node.right); } /** * 6 二分搜索树,后序遍历 顾名思义,先遍历左节点,再遍历右节点,最后遍历根节点 * @author weidoudou * @date 2022/11/5 14:54 * @return null **/ public boolean postOrder(){ postOrder(root); return false; } //后序遍历 递归 private void postOrder(Node node){ //终止条件 if(node==null){ return; } //递归 postOrder(node.left); postOrder(node.right); System.out.println(node.e);//1 } /** * 基于前序遍历完成toString打印 * @author weidoudou * @date 2022/11/5 15:20 * @return java.lang.String **/ @Override public String toString() { final StringBuffer sb = new StringBuffer(); generate(root,0); return sb.toString(); } private void generate(Node node, int depth){ generate(depth); //1 终止条件 if(node==null){ System.out.println("null"); return; } //2 递归条件 System.out.println(node.e); depth++; generate(node.left,depth); generate(node.right,depth); } private void generate(int depth){ for(int i = 0;i<depth;i++){ System.out.print("=="); } } }
- 测试类:
package com.company; public class Main { public static void main(String[] args) { BST2<Integer> bst2 = new BST2<>(); int [] nums = {5,3,6,8,4,2}; for(int i = 0;i<nums.length;i++){ bst2.add(nums[i]); } /* System.out.println(bst2.preOrder());*/ System.out.println(bst2.inOrder()); System.out.println(bst2.postOrder()); //System.out.println(bst2); } }
- 测试结果:
2 3 4 5 6 8 false 2 4 3 8 6 5 false Process finished with exit code 0
诸葛