美文网首页
树的遍历,排序和查找

树的遍历,排序和查找

作者: 皮蛋豆腐酱油 | 来源:发表于2019-08-12 17:07 被阅读0次

    1.中序遍历

    /**
     * Definition for a binary tree node.
     * public class TreeNode {
     *     int val;
     *     TreeNode left;
     *     TreeNode right;
     *     TreeNode(int x) { val = x; }
     * }
     */
    class Solution {
        public List<Integer> inorderTraversal(TreeNode root) {
            List<Integer> list = new ArrayList<Integer>();
            Stack<TreeNode> stack = new Stack<TreeNode>();
            if(root == null) return list;
            TreeNode p = root;
            while(p != null) {
                stack.push(p);
                p = p.left;
            }
            
            while(!stack.isEmpty()) {
                TreeNode q = stack.pop();
                list.add(q.val);
                TreeNode k = q.right;
                while(k != null) {
                    stack.push(k);
                    k = k.left;
                }
            }
            return list;
                        
        }
    }
    

    2.前序遍历

    /**
     * Definition for a binary tree node.
     * public class TreeNode {
     *     int val;
     *     TreeNode left;
     *     TreeNode right;
     *     TreeNode(int x) { val = x; }
     * }
     */
    class Solution {
        public List<Integer> preorderTraversal(TreeNode root) {
            List<Integer> list = new ArrayList<Integer>();
            Stack<TreeNode> stack = new Stack<TreeNode>();
            if(root == null) return list;
            TreeNode p;
            stack.push(root);
            while(!stack.isEmpty()) {
                p = stack.pop();
                list.add(p.val);
                //栈先入后出,所以先压右边
                if(p.right != null) {
                    stack.push(p.right);
                }
                if(p.left != null) {
                    stack.push(p.left);
                }
            }
            return list;
        }
    }
    

    3.后序遍历

    /**
     * Definition for a binary tree node.
     * public class TreeNode {
     *     int val;
     *     TreeNode left;
     *     TreeNode right;
     *     TreeNode(int x) { val = x; }
     * }
     */
    class Solution {
        public List<Integer> postorderTraversal(TreeNode root) {
            List<Integer> res = new ArrayList<Integer>();
            if(root == null)
                return res;
            Stack<TreeNode> stack = new Stack<TreeNode>();
            stack.push(root);
            while(!stack.isEmpty()){
                TreeNode node = stack.pop();
                if(node.left != null) stack.push(node.left);//和传统先序遍历不一样,先将左结点入栈
                if(node.right != null) stack.push(node.right);//后将右结点入栈
                res.add(0,node.val);                        //逆序添加结点值
            }     
            return res;
        }
    }
    

    4.层次遍历

    /**
     * Definition for a binary tree node.
     * public class TreeNode {
     *     int val;
     *     TreeNode left;
     *     TreeNode right;
     *     TreeNode(int x) { val = x; }
     * }
     */
    class Solution {
        public List<List<Integer>> levelOrder(TreeNode root) {
            List<List<Integer>> res = new ArrayList<>();
            if(root == null) return res;
            Queue<TreeNode> q = new LinkedList<>();
            q.offer(root);
            
            while(!q.isEmpty()){
                List<Integer> list = new ArrayList<>();
                int size = q.size();
                for(int i = 0; i < size; i++){
                    TreeNode cur = q.poll();
                    list.add(cur.val);
                    if(cur.left != null) q.offer(cur.left);
                    if(cur.right != null) q.offer(cur.right);
                }
                res.add(list);
            }
            return res;
            
        }
    }
    

    排序和查找见下方链接
    https://blog.csdn.net/m0_37990703/article/details/78184305

    5.选择排序

    思路:在乱序数组中,假设第一位数最小,依次让后面的数与之比较,若遇到比它小的数就交换位置,一趟下来第一个数就是序列中最小的数,然后从第二个数开始重复操作。

      public static void selectSort(int[] array) {  
            int temp;
            for (int i = 0; i < array.length; i++) {  
                for (int j = i + 1; j < array.length; j++) {  
                    if (array[j] < array[i]) {  
                        temp = array[j];  
                        array[j] = array[I];
                        array[i] = temp;
                    }  
                }  
            }  
            for (int i = 0; i < array.length; i++) {  
                System.out.println(array[i] + " "); 
            }
            
        }
    

    6.插入排序

      public static void insertSort(int[] array) {  
            for (int i = 1; i < array.length; i++) {  
                int temp = array[i];  
                int j = i - 1;
                for (; j >= 0 && array[j] > temp; j--) {  
                    //将大于temp的值整体后移一个单位  
                    array[j + 1] = array[j];  
                }  
                array[j + 1] = temp;  
            }  
            for (int i = 0; i < array.length; i++) {  
                System.out.println(array[i] + " "); 
            }
        }  
    

    7.shell排序

    希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本。希尔排序是非稳定排序算法。
    希尔排序是基于插入排序的以下两点性质而提出改进方法的:
    插入排序在对几乎已经排好序的数据操作时,效率高,即可以达到线性排序的效率;
    但插入排序一般来说是低效的,因为插入排序每次只能将数据移动一位。
    先取一个正整数d1 < n, 把所有相隔d1的记录放一组,每个组内进行直接插入排序;然后d2 < d1,重复上述分组和排序操作;直至di = 1,即所有记录放进一个组中排序为止。

      public static void shellSort(int[] arr) {  
            int len = arr.length;
            // 所有的步长可能性(首次为数组长的一半,接下来每次为上一次的一半)
            for (int gap = len / 2; gap > 0; gap /= 2) {
                // 将步长中的所有元素进行插入排序
                for(int w = 0; w < gap; w++){
                    // 步长为gap的插入排序
                    // 对照插入排序
                    /*
                     * for(int i = p + 1; i < r; i++){
                     *        int key = arr[I];
                     *        int j = i - 1;
                     *        while(j >= 0 && arr[j] > key) {
                     *            arr[j + 1] = arr[j];
                     *            j--;
                     *        }
                     *        arr[j + 1] = key;
                     *    }
                     */
                    for (int i = gap + w; i < len; i += gap) {
                        // 插入排序
                        int key = arr[I];
                        int j = i - gap;
                        while (j >= 0 && arr[j] > key) {
                            arr[j + gap] = arr[j];
                            j -= gap;
                        }
                        arr[j + gap] = key;
                    }
                }
            }
            for (int i = 0; i < arr.length; i++) {  
                System.out.println(arr[i] + " "); 
            }
        }  
    

    8.冒泡排序

    思路:在要排序的一组数中,对当前还未排好序的范围内的全部数,自上而下对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒。即:每当两相邻的数比较后发现它们的排序与排序要求相反时,就将它们互换。
    代码:

      public static void bubbleSort(int[] array) {  
            int temp = 0;  
            for (int i = 0; i < array.length - 1; i++) {  
                for (int j = 0; j < array.length - 1 - i; j++) {  
                    if (array[j] > array[j + 1]) {  
                        temp = array[j];  
                        array[j] = array[j + 1];  
                        array[j + 1] = temp;  
                    }  
                }  
            }  
            System.out.println(Arrays.toString(array) + " bubbleSort");  
        }  
    

    9.快速排序

    快速排序是排序方法里面速率最快的一种方法,是对冒泡排序的一种改进, 属于不稳地排序。

     public static void main(String []args) {
            int[] array = new int[]{1,4,5,2,3,5};
            quickSort(array, 0, array.length-1);
            System.out.print(Arrays.toString(array));
        }
        
        public static void quickSort(int a[],int start,int end)//start是每次快速排序的数组开始下标,end是结束下标
        {
            if(start>end)
            {
                return;
            }
            int startNum=a[start];
            int left=start;//left是左标记的下标
            int right=end;//right是右标记的下标
            while(left < right)
            {
                //当左标记在右标记的左边并且右标记的数比左标记的数大时
                while(left<right&&a[right]>=a[start])
                {
                    right--;//右边标记左移
                }
                while(left<right&&a[left]<=a[start])
                {
                    left++;//左边标记右移
                }
                int temp=a[left];//交换左边右边数的操作
                a[left]=a[right];
                a[right]=temp;
            }
            a[start]=a[right];//将中间数交换到左右标记相遇的地方
            a[right]=startNum;
            quickSort(a,right+1,end);//对中间数左边的数组进行递归快速排序
            quickSort(a,start,right-1);//对中间数右边的数组进行递归快速排序
        } 
    

    10.二分查找

    private static int myBinarySearch(int [] array , int k) {
            int low = 0;
            int high = array.length - 1;
            while(low <= high) {
                int mid = (low + high) / 2;
                if(array[mid] == k) {
                    return mid;
                } else if(array[mid] < k) {
                    low = mid + 1;
                } else {
                    high = mid - 1;
                }
            }
            return -1;
        }
    

    相关文章

      网友评论

          本文标题:树的遍历,排序和查找

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