美文网首页
算法记录 | Day15 二叉树(04)

算法记录 | Day15 二叉树(04)

作者: perry_Fan | 来源:发表于2022-11-10 15:41 被阅读0次
    • 110.平衡二叉树
      1. 二叉树的所有路径
    • 404.左叶子之和

    【110.平衡二叉树 】

    /**
     * 给定一个二叉树,判断它是否是高度平衡的二叉树。
     *
     * 本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。
     *
     * 示例 1:
     *
     * 给定二叉树 [3,9,20,null,null,15,7]
     */
    
    public class balanceTree_110 {
    
        public boolean isBalanced(TreeNode root) {
            return getHeight(root) != -1;
        }
    
        private int getHeight(TreeNode root){
            if (root == null){
                return 0;
            }
            int leftHeight = getHeight(root.left);
            if(leftHeight == -1){
                return -1;
            }
            int rightHeight = getHeight(root.right);
            if (rightHeight == -1){
                return -1;
            }
    
            if (Math.abs(leftHeight - rightHeight) > 1){
                return -1;
            }
    
            return Math.max(leftHeight, rightHeight) + 1;
        }
    }
    

    【257. 二叉树的所有路径】

    /**
     * 给你一个二叉树的根节点 root ,按 任意顺序 ,返回所有从根节点到叶子节点的路径。
     *
     * 叶子节点 是指没有子节点的节点。
     */
    public class binaryTreePaths_257 {
    
        public List<String> binaryTreePaths(TreeNode root) {
            List<String> result = new ArrayList<>();
            if (root == null){
                return result;
            }
    
            Stack<Object> stack = new Stack<>();
            // 节点和路径同时入栈
            stack.push(root);
            stack.push(root.val + "");
    
            while(!stack.isEmpty()){
                String path = (String) stack.pop();
                TreeNode node = (TreeNode) stack.pop();
    
                // 若找到叶子节点
                if (node.left == null && node.right == null){
                    result.add(path);
                }
                // 右子节点不为空
                if (node.right != null){
                    stack.push(node.right);
                    stack.push(path + "->" + node.right.val);
                }
                // 左子节点不为空
                if (node.left != null){
                    stack.push(node.left);
                    stack.push(path + "->" + node.left.val);
                }
            }
            return result;
        }
    }
    

    【404.左叶子之和 】

    /**
     * 给定二叉树的根节点 root ,返回所有左叶子之和。
     */
    public class sumOfLeftLeaves_404 {
    
        public int sumOfLeftLeaves(TreeNode root) {
            if (root == null) {
                return 0;
            }
            Stack<TreeNode> stack = new Stack<>();
            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;
        }
    }
    
    

    相关文章

      网友评论

          本文标题:算法记录 | Day15 二叉树(04)

          本文链接:https://www.haomeiwen.com/subject/rrwztdtx.html