栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

NowCoderTOP35-40——持续更新ing

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

NowCoderTOP35-40——持续更新ing

TOP35. 判断是不是完全二叉树
public class Solution {
    
    public boolean isCompleteTree (TreeNode root) {
        // 空树是完全二叉树
        if(root == null) return true;
        // 辅助队列
        Queue 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 {
    

    
    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 listP = getPath(root, p);
//         ArrayList 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 getPath(TreeNode root, int target) {
//         ArrayList list = new ArrayList();
//         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 path1 = new ArrayList();
//         ArrayList path2 = new ArrayList();
//         // 根节点到两个节点的路径
//         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 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;
    }
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1034770.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号