参考文献链接:代码随想录
本人代码是Java版本的,如有别的版本需要请上代码随想录网站查看。
110.平衡二叉树
力扣题目链接
解题思路
这道题目刚看到以为和二叉树的最大深度差不多,上来写了一堆迭代求深度的代码结果发现不对劲。
看了题解才发现高度和深度是完全不一样的。
知道高度的定义后,如何遍历数呢,那当然是后续遍历,因为后序遍历是左右中,只有知道左和右之后你才能知道中间节点的高度。所以求高度用后续,求深度的话前序即可。
代码示例
/**
* Definition for a binary tree node.
* public 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;
}
public int getHeight(TreeNode node){
if(node == null){
return 0;
}
int leftHeight = 0;
int rightHeight = 0;
leftHeight = getHeight(node.left);
if(leftHeight == -1){
return -1;
}
rightHeight = getHeight(node.right);
if(rightHeight == -1){
return -1;
}
if(Math.abs(leftHeight - rightHeight) > 1){
return -1;
}else{
return Math.max(leftHeight,rightHeight) + 1;
}
}
}
257. 二叉树的所有路径
力扣题目链接
解题思路
首先确定这道题的遍历顺序,因为题目要求是顺序的路径,那我们就得用前序遍历。然后我们还是使用递归法,一层一层去收集路径,当某个节点没有左右子树就说明到头了,收集这个路径即可。递归的时候我们要加入回溯,因为我们要收集所有路径而不是一条,所以递归后要回溯到上层,这样才能收集另一个子树的路径。
更多详细请看代码和注释
代码示例
class Solution {
public List<String> binaryTreePaths(TreeNode root) {
List<String> result = new ArrayList<String>();
pin(root,new ArrayList<Integer>(),result);
return result;
}
//递归参数解释,paths是每一个节点val的收集,result是每天路径的收集。
public void pin(TreeNode node,List<Integer> paths,List<String> result){
//为什么这次终止条件不在最上面,因为终止的时候要把val拼成路径,会漏掉该node的val值,所以要先添加。
paths.add(node.val);
if(node.left == null && node.right == null){
//当没有左右子树就收集路径
StringBuffer sb = new StringBuffer();
for(int i = 0;i<paths.size()-1;i++){
sb.append(paths.get(i)).append("->");
}
sb.append(paths.get(paths.size() - 1));
result.add(sb.toString());
return;
}
//当左子树不为null,就加入递归,递归后记得回溯。
if(node.left != null){
pin(node.left,paths,result);
paths.remove(paths.size() - 1);
}
//同理
if(node.right != null){
pin(node.right,paths,result);
paths.remove(paths.size() - 1);
}
}
}
404.左叶子之和
力扣题目链接
解题思路
该题目其实跟求最大深度差不多,层序遍历即可,只不过当我们添加左子树进入队列时,判断一下如果该左子树是左叶子,那就加上它的值。
代码示例
class Solution {
public int sumOfLeftLeaves(TreeNode root) {
int result = 0;
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(root);
while(!queue.isEmpty()){
int len = queue.size();
while(len-- > 0){
TreeNode temp = queue.poll();
if(temp.left != null){
//在此处判断加入的左子树是不是左叶子即可。
if(temp.left.left == null && temp.left.right == null){
result = result + temp.left.val;
}
queue.offer(temp.left);
}
if(temp.right != null){
queue.offer(temp.right);
}
}
}
return result;
}
}
222.完全二叉树的节点个数
力扣题目链接
解题思路
本题还是跟上述题目一个思路,前序遍历一直记录节点数即可。
递归法
class Solution {
public int countNodes(TreeNode root) {
if(root==null){
return 0;
}
//返回左右节点长度+1 1是当前节点
return countNodes(root.left)+countNodes(root.right)+1;
}
}
递归法
层序遍历时每次poll的时候result++即可。
class Solution {
public int countNodes(TreeNode root) {
if(root==null){
return 0;
}
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(root);
int result = 0;
while(!queue.isEmpty()){
int size = queue.size();
while(size-->0){
TreeNode now = queue.poll();
result++;
if(now.left!=null){
queue.offer(now.left);
}
if(now.right!=null){
queue.offer(now.right);
}
}
}
return result;
}
}