代码随想录第十七天|(LeetCode)110.平衡二叉树 ,(LeetCode)257. 二叉树的所有路径 ,(LeetCode)404.左叶子之和

 110.平衡二叉树

        题目链接:110. 平衡二叉树 - 力扣(LeetCode)

        代码随想录题目解析:代码随想录 (programmercarl.com)

具体代码实现:

import java.util.Scanner;

//给定一个二叉树,判断它是否是高度平衡的二叉树。

class TreeNode {
	int val;
	TreeNode left;
	TreeNode right;
	TreeNode() {}
	TreeNode(int val) { this.val = val; }
	TreeNode(int val, TreeNode left, TreeNode right) {
		this.val = val;
		this.left = left;
		this.right = right;
	}
}


//递归法
class Solution {
    public boolean isBalanced(TreeNode root) {
    	return getHeight(root) != -1; 
    }

	private int getHeight(TreeNode root) {
    	if(root == null)    return 0;
    	int leftHhight = getHeight(root.left);
    	if(leftHhight == -1)    return -1;
    	int rightHhight = getHeight(root.right);
    	if(rightHhight == -1)    return -1;
    	
    	if(Math.abs(leftHhight - rightHhight) > 1) return -1;
    	
    	return Math.max(leftHhight, rightHhight)+1;
    	
	}
}


public class Solution_text {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入一个完全二叉树的节点值(按层序遍历顺序输入,空节点用-1表示):");
        String[] values = scanner.nextLine().trim().split(" ");
        int index = 0;
        TreeNode root = buildTree(values, index);

        Solution pre = new Solution();
        boolean res = pre.isBalanced(root);
        
        if(res == true)         System.out.println("它是高度平衡的二叉树");
        else    System.out.println("它不是高度平衡的二叉树");
        

        scanner.close();

    }

    private static TreeNode buildTree(String[] values, int index) {
        if (index >= values.length || values[index].equals("-1")) {
            return null;
        }

        int val = Integer.parseInt(values[index]);
        TreeNode node = new TreeNode(val , buildTree(values, 2 * index + 1) , buildTree(values, 2 * index + 2));

        return node;
    }

}

 257. 二叉树的所有路径 

        题目链接:257. 二叉树的所有路径 - 力扣(LeetCode)

        代码随想录题目解析:代码随想录 (programmercarl.com)

具体代码实现:

import java.util.ArrayList;
import java.util.Scanner;

//给定一个二叉树,返回所有从根节点到叶子节点的路径。

class TreeNode {
	int val;
	TreeNode left;
	TreeNode right;
	TreeNode() {}
	TreeNode(int val) { this.val = val; }
	TreeNode(int val, TreeNode left, TreeNode right) {
		this.val = val;
		this.left = left;
		this.right = right;
	}
}


//递归法
class Solution {
    public ArrayList<String> binaryTreePaths(TreeNode root) {
    	ArrayList<String> res = new ArrayList<String>();
    	if(root == null)    return res;
    	ArrayList<Integer> path = new ArrayList<Integer>();
    	traversal(root,path,res);
    	return res;

    }

    private void traversal(TreeNode root, ArrayList<Integer> paths, ArrayList<String> res) {
        paths.add(root.val);// 前序遍历,中
        // 遇到叶子结点
        if (root.left == null && root.right == null) {
            // 输出
            StringBuilder sb = new StringBuilder();// StringBuilder用来拼接字符串,速度更快
            for (int i = 0; i < paths.size() - 1; i++) {
                sb.append(paths.get(i)).append("->");
            }
            sb.append(paths.get(paths.size() - 1));// 记录最后一个节点
            res.add(sb.toString());// 收集一个路径
            return;
        }
        // 递归和回溯是同时进行,所以要放在同一个花括号里
        if (root.left != null) {               // 左
            traversal(root.left, paths, res);
            paths.remove(paths.size() - 1);    // 回溯
        }
        if (root.right != null) {              // 右
            traversal(root.right, paths, res);
            paths.remove(paths.size() - 1);    // 回溯
        }
    }
}

public class Solution_text {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入一个完全二叉树的节点值(按层序遍历顺序输入,空节点用null表示):");
        String[] values = scanner.nextLine().trim().split(" ");
        int index = 0;
        TreeNode root = buildTree(values, index);

        Solution pre = new Solution();
        ArrayList<String> res = pre.binaryTreePaths(root);
        
        for(String s : res){
            System.out.println(s);
        }

        scanner.close();

    }

    private static TreeNode buildTree(String[] values, int index) {
        if (index >= values.length || values[index].equals("null")) {
            return null;
        }

        int val = Integer.parseInt(values[index]);
        TreeNode node = new TreeNode(val , buildTree(values, 2 * index + 1) , buildTree(values, 2 * index + 2));

        return node;
    }

}

 404.左叶子之和

        题目链接:404. 左叶子之和 - 力扣(LeetCode)

        代码随想录题目解析:代码随想录 (programmercarl.com)

具体代码实现:

import java.util.Scanner;
import java.util.Stack;

//给定二叉树的根节点 root ,返回所有左叶子之和。

class TreeNode {
	int val;
	TreeNode left;
	TreeNode right;
	TreeNode() {}
	TreeNode(int val) { this.val = val; }
	TreeNode(int val, TreeNode left, TreeNode right) {
		this.val = val;
		this.left = left;
		this.right = right;
	}
}

class Solution {
    public int sumOfLeftLeaves(TreeNode root) {
        if (root == null) return 0;
        Stack<TreeNode> stack = new Stack<TreeNode> ();
        stack.add(root);
        int result = 0;
        while (!stack.isEmpty()) {
            TreeNode node = stack.pop();
            if (node.left != null && node.left.left == null && node.left.right == null) {
                result += node.left.val;
            }
            if (node.right != null) stack.add(node.right);
            if (node.left != null) stack.add(node.left);
        }
        return result;
    }
}

public class Solution_text {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入一个完全二叉树的节点值(按层序遍历顺序输入,空节点用null表示):");
        String[] values = scanner.nextLine().trim().split(" ");
        int index = 0;
        TreeNode root = buildTree(values, index);

        Solution pre = new Solution();
        System.out.println("该树所有左叶子之和:" + pre.sumOfLeftLeaves(root));

        scanner.close();

    }

    private static TreeNode buildTree(String[] values, int index) {
        if (index >= values.length || values[index].equals("null")) {
            return null;
        }

        int val = Integer.parseInt(values[index]);
        TreeNode node = new TreeNode(val , buildTree(values, 2 * index + 1) , buildTree(values, 2 * index + 2));

        return node;
    }

}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值