第15天|LeetCode110.平衡二叉树 、LeetCode257. 二叉树的所有路径、LeetCode404.左叶子之和

1.题目链接:110. 平衡二叉树

题目描述:

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

本题中,一棵高度平衡二叉树定义为一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。

解法:

        用递归来做,三步曲:

                ①因为我要用-1来表示该数是否是平衡二叉树,故返回-1就不是平衡二叉树,返回不是-1就是平衡二叉树,故返回值为int型(表示的是高度);参数就root。

                ②终止条件---if(root == null) return 0;

                ③单层逻辑---遍历左子树,求高度,如果leftHeight == -1,return -1;遍历右子树,求高度,如果rightHeight == -1,返回-1;然后求该节点对应的树是不是平衡二叉树,if(Math.abs(leftHeight - rightHeight) > 1){return -1},否则的话,返回该节的高度即return max(leftHeig,rightHeight)+ 1。

                ④至于遍历顺序,因为我们要获得左右子树的情况返回给中间节点,所以用后序遍历。

下面为代码(java):

第15天|LeetCode110.平衡二叉树 、LeetCode257. 二叉树的所有路径、LeetCode404.左叶子之和_第1张图片

2.题目链接:257. 二叉树的所有路径 

题目描述:

                给你一个二叉树的根节点 root ,按 任意顺序 ,返回所有从根节点到叶子节点的路径。

叶子节点 是指没有子节点的节点。

解法:

                三步曲:

                        1.参数root,Listpath,List res,返回值类型void---因为我们要将求出的路径放到res中就可以,所以是void。

                        2.终止条件:当我们遍历到叶子节点的时候,我们就要将存储好的path放到res中,所以是当遍历到叶子节点的时候是终止条件。因为我们创建的path存的是Int型数据,而题目中有要求->,所以呢要用StringBuilder将每个节点后连一个->并整体连起来。然后再将其转成String型,加入到res中。

                        3.单层逻辑:

                        ①选顺序---选中左右,因为是要求根节点到子节点的路径,所以用中左右即前序遍历。

                        ②中即将root.val放入path中,此时要注意,对中的处理要放在终止条件前,因为当root为叶子节点的时候,如果中放在终止条件的后面,那直接就返回了,没有获取到叶子节点的值。

                        ③在进行向左或者向右遍历的时候要注意,root.left/root.right != null,要注意的是这里用到了回溯,也就是说当我们获得了1-3-5的顺序后,我们还要获得1-2的顺序,那我们要将3-5都弹出才行,故在下面加了个path.remove(path.size()-1)。

                        ④此时可能想不明白,为什么在中刚刚add,现在要remover了呢?因为我们这是递归,其实运行的过程是将整个的路径获取完之后,才一层一层的返回,然后一层一层的remove元素,直到根节点的时候,此时再向右获取路径,然后再回溯。最后得到的路径就都放到了res中并且转成了要求的字符串的类型。

下面为代码(java):

第15天|LeetCode110.平衡二叉树 、LeetCode257. 二叉树的所有路径、LeetCode404.左叶子之和_第2张图片

 第15天|LeetCode110.平衡二叉树 、LeetCode257. 二叉树的所有路径、LeetCode404.左叶子之和_第3张图片

3.题目链接:404. 左叶子之和 

题目描述:

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

解法:

                用递归来写,三步曲:

                        ①参数和返回值,root,返回值为int型因为要求左叶子之和。

                        ②终止条件,if(root == null){return 0; },if(root.left == null && root.right == null){return 0;}----因为当遇到叶子节点的时候,叶子节点的左叶子之和就是0,而当我们遇到叶子节点的父节的时候才要返回自时的左叶子之和。当然这部可以不写,但是写了的话可以少走一步递归。

                        ③单层逻辑:用后序遍历---因为要先获取左右子树的左叶子之和,返回父节点,求总共的左叶子之和。向左遍历,if(root.left != null && root.left.left == null && root.left.right == null){leftSum = root.left.val;},然后向右遍历,最后res = leftSum + rightSum。

下面为代码(java):

第15天|LeetCode110.平衡二叉树 、LeetCode257. 二叉树的所有路径、LeetCode404.左叶子之和_第4张图片

4.总结:

                ①今天学习了平衡二叉树,二叉树路径以及左叶子和。

                ②我觉得重点是想清楚处理逻辑。此三题都可以用迭代来做,二刷再来。

                ③eg:平衡二叉树---左子树是不是平衡二叉树,右子树是不是平衡二叉树,父节点代表的树是不是平衡二叉树,不是返回return-1,是返回高度。 

                ④eg:二叉树路径---中左右,将值放到path中,然后遍历左子树,然后遍历右子树,同时要注意,我们不仅要获得左边的1-3-5,还要获得右边的1-2,故在遍历的过程中要有回溯操作,该题要注意的是中要放在终止条件前。

                ⑤eg:左叶子之和---求左子树的左叶子和,再求右子树的左叶子和加一起;如何求左叶子和呢?就是当遍历到左叶子节点的父节点的时候,返回此时的左叶子值;然后求右子树的,最后加一起即可。

你可能感兴趣的:(算法,数据结构,java,深度优先)