代码随想录算法训练营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;
}
}

浙公网安备 33010602011771号