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

树的遍历,排序和查找

作者: 皮蛋豆腐酱油 | 来源:发表于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;
    }

相关文章

  • 树的遍历,排序和查找

    1.中序遍历 2.前序遍历 3.后序遍历 4.层次遍历 排序和查找见下方链接https://blog.csdn.n...

  • 数据结构必备代码

    目录: 排序算法 树的遍历 查找 链表插入 数组与列表转化 二维数组排序 java中输入 集合遍历 一、基本排序1...

  • 常见简单算法

    1.数组 二分查找: 冒泡排序 插入排序 选择排序 快速排序 链表 链表反转 合并2个有序链表 树 前序遍历

  • 机试常用算法和题型-树专题

    静态创建新结点、构造二叉树实现前序中序遍历还原 二叉排序树查找、插入、构造科学方法 二叉排序树建立,非递归遍历方法...

  • Array常用方法总结

    查找 遍历 拷贝 增删 排序

  • 查找算法

    查找算法有一种思路是先排序,然后对排序结果进行遍历查找。

  • 常见数据结构

    参考文档数据结构中的树Bit-map空间压缩和快速排序去重浅谈算法和数据结构: 七 二叉查找树Java遍历树(深度...

  • 108. Convert Sorted Array to Bin

    根据已排序数组创建平衡二叉查找树 需要认识到,平衡二叉查找树的中序遍历即为有序数组。 递归解法:

  • 二叉查找树的查找和排序方法的实现

    定义二叉树 二叉查找树的查找和排序方法的实现

  • 99-数据结构和算法

    难点:二叉树的遍历 红黑树 图的遍历 二叉查找树二叉查找树(binary search tree),二叉查找树在二...

网友评论

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

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