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):
2.题目链接:257. 二叉树的所有路径
题目描述:
给你一个二叉树的根节点 root
,按 任意顺序 ,返回所有从根节点到叶子节点的路径。
叶子节点 是指没有子节点的节点。
解法:
三步曲:
1.参数root,List<Integer>path,List<String> 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):
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):
4.总结:
①今天学习了平衡二叉树,二叉树路径以及左叶子和。
②我觉得重点是想清楚处理逻辑。此三题都可以用迭代来做,二刷再来。
③eg:平衡二叉树---左子树是不是平衡二叉树,右子树是不是平衡二叉树,父节点代表的树是不是平衡二叉树,不是返回return-1,是返回高度。
④eg:二叉树路径---中左右,将值放到path中,然后遍历左子树,然后遍历右子树,同时要注意,我们不仅要获得左边的1-3-5,还要获得右边的1-2,故在遍历的过程中要有回溯操作,该题要注意的是中要放在终止条件前。
⑤eg:左叶子之和---求左子树的左叶子和,再求右子树的左叶子和加一起;如何求左叶子和呢?就是当遍历到左叶子节点的父节点的时候,返回此时的左叶子值;然后求右子树的,最后加一起即可。