NowCoderTOP35-40——持续更新ing

Posted 王嘻嘻-

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了NowCoderTOP35-40——持续更新ing相关的知识,希望对你有一定的参考价值。

TOP35. 判断是不是完全二叉树

public class Solution 
    /**
     * 判断完全二叉树,当遍历当前层时如果遇到空节点,如果该空节点右侧还有节点,说明该树
     * 一定不是完全二叉树,直接返回false,遍历完返回true
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * @param root TreeNode类 
     * @return bool布尔型
     */
    public boolean isCompleteTree (TreeNode root) 
        // 空树是完全二叉树
        if(root == null) return true;
        // 辅助队列
        Queue<TreeNode> queue = new LinkedList<>();
        // 先将根节点入队
        queue.offer(root);
        // 标记空节点
        boolean flag = true;
        while(!queue.isEmpty()) 
            TreeNode cur = queue.poll();
            if(cur == null) 
                // 如果遇到某个节点为空,进行标记
                flag = false;
            else 
                // 遇到空节点直接返回false
                if(flag == false) return false;
                queue.offer(cur.left);
                queue.offer(cur.right);
            
        
        return true;
    

TOP36. 判断是不是平衡二叉树

public class Solution 
    public boolean IsBalanced_Solution(TreeNode root) 
        if(root == null) return true;
        // 判断左子树和右子树是否符合规则,且深度不能超过2
        return IsBalanced_Solution(root.left) && IsBalanced_Solution(root.right) 
            && Math.abs(TreeDepth(root.left) - TreeDepth(root.right))  <= 1;
    
    
    // 二叉树的深度
    public int TreeDepth(TreeNode root) 
        if(root == null) return 0;
        return Math.max(TreeDepth(root.left), TreeDepth(root.right)) + 1;
    

TOP37. 二叉搜索树的最近公共祖先

public class Solution 
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * @param root TreeNode类 
     * @param p int整型 
     * @param q int整型 
     * @return int整型
     */

    
    public int lowestCommonAncestor (TreeNode root, int p, int q) 
        // 递归
        // 空树没有最近公共祖先
        if(root == null) return -1;
        // pq在该节点两边说明这就是最近公共祖先
        if(p >= root.val && q <= root.val || (q >= root.val && p <= root.val))
            return root.val;
        
        //pq都在该节点的左边
        else if(p <= root.val && q <= root.val) 
            // 进入左子树
            return lowestCommonAncestor(root.left, p , q);
        
        else
            // 进入右子树
        return lowestCommonAncestor(root.right, p , q);
    
    
    // 非递归
//         // 从根节点到两个节点的路径
//         ArrayList<Integer> listP = getPath(root, p);
//         ArrayList<Integer> listQ = getPath(root, q);
//         int res = 0;
//         // 比较两个路径,找到第一个不同的点
//         for(int i = 0; i < listP.size() && i < listQ.size(); i++) 
//             int p1 = listP.get(i);
//             int q1 = listQ.get(i);
//             // 最后一个相同的节点就是最近公共祖先
//             if(p1 == q1) res = p1;
//         
//         return res;
//     
//         
//             // 求根节点到目标节点的路径
//     public ArrayList<Integer> getPath(TreeNode root, int target) 
//         ArrayList<Integer> list = new ArrayList<Integer>();
//         TreeNode node = root;
//         // 节点值不同,可以直接用值比较
//         while(node.val != target) 
//             list.add(node.val);
//             if(target > node.val) node = node.right;
//             else node = node.left;
//         
//         // 将节点值加入链表
//         list.add(node.val);
//         return list;
//     

TOP38. 在二叉树中找到两个节点的最近公共祖先

public class Solution  
    public int lowestCommonAncestor (TreeNode root, int o1, int o2) 
        // 递归法
        if(root == null) return -1;
        // 该节点是其中某一个的节点时
        if(root.val == o1 || root.val == o2) return root.val;
        // 左子树中寻找公共祖先
        int l = lowestCommonAncestor(root.left, o1, o2);
        // 右子树中寻找
        int r = lowestCommonAncestor(root.right, o1, o2);
        // 左子树中未找到
        if(l == -1) return r;
        // 右子树中未找到
        if(r == -1) return l;
        // 否则返回当前节点
        return root.val;
    
    
// step 1:利用dfs求得根节点到两个目标节点的路径:每次选择二叉树的一棵子树往下找,同时路径数组增加这个遍历的节点值。
// step 2:一旦遍历到了叶子节点也没有,则回溯到父节点,寻找其他路径,回溯时要去掉数组中刚刚加入的元素。
// step 3:然后遍历两条路径数组,依次比较元素值。
// step 4:找到两条路径第一个不相同的节点即是最近公共祖先。 
//         ArrayList<Integer> path1 = new ArrayList<Integer>();
//         ArrayList<Integer> path2 = new ArrayList<Integer>();
//         // 根节点到两个节点的路径
//         dfs(root, path1, o1);
//         // 重置标志位
//         flag = false;
//         // 查找下一个
//         dfs(root, path2, o2);
//         int res = 0;
//         //比较两个路径,找到第一个不同的点
//         for(int i = 0; i < path1.size() && i < path2.size(); i++) 
//             int p1 = path1.get(i);
//             int p2 = path2.get(i);
//             if(p1 == p2) res = p1;
//             else break;
//         
//         return res;
//     
//     // 记录是否找到到o的路径
//     boolean flag = false;
//     // 根节点到目标节点的路径
//     public void dfs(TreeNode root, ArrayList<Integer> path, int o) 
//         if(flag || root == null) return;
//         // 根节点记录下
//         path.add(root.val);
//         // 节点值不同,so可以用值比较
//         if(root.val == o) 
//             flag = true;
//             return;
//         
//         // dfs遍历
//         dfs(root.left, path, o);
//         dfs(root.right, path, o);
//         // 找到
//         if(flag) return;
//         // 没有找到,回溯
//         path.remove(path.size() - 1);
//     

TOP40. 重建二叉树

public class Solution 
    public TreeNode reConstructBinaryTree(int [] pre,int [] vin) 
        int lenPre = pre.length;
        int lenIn = vin.length;
        // 边界
        if(lenPre == 0 || lenIn == 0) return null;
        // 构建根节点
        TreeNode root = new TreeNode(pre[0]);
        for(int i = 0; i < lenIn ; i++) 
            // 找到中序遍历的前序第一个元素
            if(pre[0] == vin[i]) 
                // 构建左子树
                // Arrays.copyOfRange 数组中指定范围copy from to(不包括to)
                root.left = reConstructBinaryTree(Arrays.copyOfRange(pre, 1, i + 1), 
                                                  Arrays.copyOfRange(vin, 0, i));
                //构建右子树
                root.right = reConstructBinaryTree(Arrays.copyOfRange(pre, i + 1, pre.length),
                                                   Arrays.copyOfRange(vin, i + 1, vin.length));
                break;
            
        
        return root;
    

以上是关于NowCoderTOP35-40——持续更新ing的主要内容,如果未能解决你的问题,请参考以下文章

NowCoderTOP12-16——持续更新ing

NowCoderTOP12-16——持续更新ing

NowCoderTOP28-34二叉树——持续更新ing

NowCoderTOP28-34二叉树——持续更新ing

NowCoderTOP23-27——持续更新ing

NowCoderTOP17-22 二分查找/排序——持续更新ing