实现二叉树先序、中序和后序遍历&&最小的K个数&&二叉树的层序遍历

85 阅读1分钟

NC45 实现二叉树先序、中序和后序遍历

题目链接

1、解题思路

递归求解即可,留意判断根为空的情况。

2、代码
import java.util.*;

/*
 * public class TreeNode {
 *   int val = 0;
 *   TreeNode left = null;
 *   TreeNode right = null;
 * }
 */

public class Solution {
    /**
     * 
     * @param root TreeNode类 the root of binary tree
     * @return int整型二维数组
     */
    
    private List<Integer> pre = new LinkedList<>();
    private List<Integer> in = new LinkedList<>();
    private List<Integer> post = new LinkedList<>();
    
    private void preOrder(TreeNode node){
        if(node == null){
            return;
        }
        pre.add(node.val);
        if(node.left != null){
            preOrder(node.left);
        }
        if(node.right != null){
            preOrder(node.right);
        }
    }
    
    private void inOrder(TreeNode node){
        if(node == null){
            return;
        }
        if(node.left != null){
            inOrder(node.left);
        }
        in.add(node.val);
        if(node.right != null){
            inOrder(node.right);
        }
    }
    
    private void postOrder(TreeNode node){
        if(node == null){
            return;
        }
        if(node.left != null){
            postOrder(node.left);
        }
        if(node.right != null){
            postOrder(node.right);
        }
        post.add(node.val);
    }
    
    public int[][] threeOrders (TreeNode root) {
        // write code here
        preOrder(root);
        inOrder(root);
        postOrder(root);
        int len = in.size();
        int[][] arr = new int[3][len];
        for(int i = 0;i < len;i++){
            arr[0][i] = pre.get(i);
            arr[1][i] = in.get(i);
            arr[2][i] = post.get(i);
        }
        return arr;
    }
}

NC119 最小的K个数

题目链接

1、解题思路
  • 使用快排的思路,分别计算次数,然后分别判断即可。
2、代码
import java.util.ArrayList;

public class Solution {
    
    private void quickSort(int[] arr,int l,int r,ArrayList<Integer> list,int k){
        int i = l,j = r,base = arr[l];
        while(i < j){
            while(i < j && arr[j] >= base){
                j--;
            }
            if(i < j){
                arr[i++] = arr[j];
            }
            while(i < j && arr[i] <= base){
                i++;
            }
            if(i < j){
                arr[j--] = arr[i];
            }
        }
        arr[i] = base;
        int num = i - l + 1; // 当前这么多元素
        if(num == k){
            for(int m = l;m <= i;m++){
                list.add(arr[m]);
            }
        }else if(num > k){
            quickSort(arr,l,i,list,k);
        }else{
            // num < k
            for(int m = l;m <= i;m++){
                list.add(arr[m]);
            }
            quickSort(arr,i+1,r,list,k-num);
        }
    }
    
    public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) {
        ArrayList<Integer> list = new ArrayList<Integer>();
        if (k == 0)
           return list;
        quickSort(input,0,input.length - 1,list,k);
        return list;
    }
}

NC15 求二叉树的层序遍历

题目链接

1、解题思路
  • 利用队列,bfs即可
2、代码
import java.util.*;

/*
 * public class TreeNode {
 *   int val = 0;
 *   TreeNode left = null;
 *   TreeNode right = null;
 * }
 */

public class Solution {
    /**
     * 
     * @param root TreeNode类 
     * @return int整型ArrayList<ArrayList<>>
     */
    public ArrayList<ArrayList<Integer>> levelOrder (TreeNode root) {
        // write code here
        ArrayList<ArrayList<Integer>> list = new ArrayList<>();
        if(root == null){
            return list;
        }
        Queue<TreeNode> queue = new LinkedList<>();
        queue.add(root);
        while(!queue.isEmpty()){
            ArrayList<Integer> temp = new ArrayList<Integer>();
            int size = queue.size();
            for(int i = 0;i < size;i++){
                TreeNode node = queue.poll();
                if(node.left != null){
                    queue.add(node.left);
                }
                if(node.right != null){
                    queue.add(node.right);
                }
                temp.add(node.val);
            }
            list.add(temp);
        }
        return list;
    }
}