算法第十四天|二叉树-补

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;
        } else {
            return Math.max(leftHeight, rightHeight) + 1;
        }
    }

平衡二叉树的定义是:该树所有节点的左右子树的深度相差不超过 1。

那么意味着,只要保证当前节点的左子树深度和右子树深度不超过1即可。

257. 二叉树的所有路径

 /**
 * 方式一
 */
 private List<List<Integer>> list= new ArrayList();

    public List<String> binaryTreePaths(TreeNode root) {
        if (root == null) {
            return new ArrayList<>();
        }
        getListByTreeNode(root, new LinkedList<>());
        return getValue();
    }

    private List<String> getValue() {
        List<String> value = new ArrayList<>();
        for(List<Integer> list1 : list) {
            StringBuilder stringBuilder = new StringBuilder();
            for (int i = 0; i < list1.size() -1; i++) {
                stringBuilder.append(list1.get(i)).append("->");
            }
            stringBuilder.append(list1.get(list1.size()-1));
            value.add(stringBuilder.toString());
        }
        return value;
    }

    public void getListByTreeNode(TreeNode root, LinkedList<Integer> value) {
        value.add(root.val);
        if (root.left == null && root.right == null) { // 根节点,将该数据放入列表中
            list.add(new ArrayList<>(value)); // 注意要创建一个新的列表放入其中
            return;
        }
        if (root.left != null) {
            getListByTreeNode(root.left, value);
            value.removeLast();
        }

        if (root.right != null) {
            getListByTreeNode(root.right, value);
            value.removeLast();
        }
    }
    
    
    /**
     * 方式二
    **/
    public List<String> binaryTreePaths(TreeNode root) {
        List<String> value = new LinkedList<>(); // 最终结果
        if (root == null) {
            return value;
        }
        LinkedList<Integer> cur = new LinkedList<>(); //临时节点
        getPathByTreeNode(root, value, cur);
        return value;
    }

 private void getPathByTreeNode(TreeNode root, List<String> value, LinkedList<Integer> cur) {
     cur.add(root.val);

     if (root.right == null && root.left == null) {
         StringBuilder stringBuilder = new StringBuilder();
         for (int i = 0; i < cur.size() - 1; i++) {
             stringBuilder.append(cur.get(i)).append("->");
         }
         stringBuilder.append(cur.get(cur.size() - 1));
         value.add(String.valueOf(stringBuilder));
     }

     if (root.left != null) {
         getPathByTreeNode(root.left, value, cur);
         cur.removeLast();
     }
     if (root.right != null) {
         getPathByTreeNode(root.right, value, cur);
         cur.removeLast();
     }
 }

注意:在递归中要进行回溯,对于左子树和右子树,递归返回之后需要进行回溯

以前我会有这样的疑问,进入递归之后,value的值可能加了N个数,但是这里只移除了一个数,怎么做到回溯的呢?

没有理解到递归就是这样的。对于当前的下层,也是每一层都进行了递归,那么返回到当前层,value列表中,必然只多了一个元素。

相当于,你每次只用关心左节点和右节点,把它认为叶子节点即可。

404. 左叶子之和

  public int sumOfLeftLeaves(TreeNode root) {
        if (root == null) {
            return 0;
        }

        int leftValue = sumOfLeftLeaves(root.left);
        int rightValue = sumOfLeftLeaves(root.right);

        int midValue = 0;
        if (root.left != null && root.left.left == null && root.left.right == null) { // 子节点是一个叶子节点
            midValue = root.left.val;
        }
        return midValue + leftValue + rightValue;
    }

左数+右数+当前左子树叶子节点数 = 总数。

// 其实有一部分重复了,当已经判断出左节点是叶子节点,那么它的左子树的递归结果就该是0

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容