代码随想录算法训练营Day16

找树左下角的值

左下角的意思是,最后一行最左边的值,层序遍历最后一层的第一个值

class Solution {  
    public int findBottomLeftValue(TreeNode root) {  
        Queue<TreeNode> queue = new LinkedList<>();  
        queue.offer(root);  
        int res = 0;//结果
        while (!queue.isEmpty()) {  
            int size = queue.size();  
            for (int i = 0; i < size; i++) {//把这一层的结点都弹出  
                TreeNode poll = queue.poll();  
                if (i == 0) {//因为我们需要的是第一个元素,因此当i==0时,记录result值,这个值随着循环不断向下进行会更新,最后正好存的是最下面一层的第一个元素  
                    res = poll.val;  
                }  
                if (poll.left != null) {  
                    queue.offer(poll.left);  
                }  
                if (poll.right != null) {  
                    queue.offer(poll.right);  
                }  
            }  
        }  
        return res;  
    }  
}

递归遍历到的深度最大的第一个叶子节点


路径总和

回溯,返回时机

class Solution {  
    public boolean hasPathSum(TreeNode root, int targetSum) {  
        if(root==null){  
            return false;  
        }  
        if (root.left == null && root.right == null) {  
            return targetSum == root.val;  
        }  
        if(root.left!=null){  
            targetSum = targetSum - root.val;  
            if(hasPathSum(root.left, targetSum)==true) return true ;  
            targetSum = targetSum + root.val;//回溯,加回来  
        }  
        if(root.right!=null){  
            targetSum = targetSum - root.val;  
            if(hasPathSum(root.right, targetSum)==true) return true ;  
            targetSum = targetSum + root.val;  
        }  
        return false;  
    }  
}

根据中序和后序构造二叉树

对数组进行操作,递归

class Solution {  
    public TreeNode buildTree(int[] inorder, int[] postorder) {  
        if(postorder.length == 0){  
            return null;  
        }  
        int rootvalue = postorder[postorder.length-1];  
        TreeNode root = new TreeNode(rootvalue);  
        int index = 0;  
        for(int i = 0;i<inorder.length;i++){  
            if(inorder[i]==rootvalue){  
                index = i;  
                break;  
            }  
        }  
        int[] leftinorder = Arrays.copyOfRange(inorder,0,index);  
        int[] rightinorder = Arrays.copyOfRange(inorder,index + 1,inorder.length);  
        int[] leftpostorder = Arrays.copyOfRange(postorder,0,leftinorder.length);  
        int[] rightpostorder = Arrays.copyOfRange(postorder,leftinorder.length,postorder.length-1);  
        root.left = buildTree(leftinorder,leftpostorder);  
        root.right = buildTree(rightinorder,rightpostorder);  
        return root;  
  
    }  
}

根据前序和中序构造二叉树

注意在分割前序数组时的参数设置

class Solution {  
    public TreeNode buildTree(int[] preorder, int[] inorder) {  
        if(preorder.length==0){  
            return null;  
        }  
        int rootval = preorder[0];  
        int index = 0;  
        TreeNode root = new TreeNode(rootval);  
        for(int i = 0;i<inorder.length;i++){  
            if(inorder[i] == rootval){  
                index = i;  
            }  
        }  
        int[] leftinorder = Arrays.copyOfRange(inorder,0,index);  
        int[] rightinorder = Arrays.copyOfRange(inorder,index+1,inorder.length);  
  
        int[] leftpreorder = Arrays.copyOfRange(preorder,1,leftinorder.length+1);//这里为什么+1?  
        int[] rightpreorder = Arrays.copyOfRange(preorder,leftinorder.length+1,preorder.length);  
  
        root.left = buildTree(leftpreorder,leftinorder);  
        root.right = buildTree(rightpreorder,rightinorder);  
  
        return root;  
    }  
}
posted @ 2025-04-11 08:31  Anson_502  阅读(12)  评论(0)    收藏  举报