重生之我在代码随想录刷算法第十三天 | 110.平衡二叉树、257. 二叉树的所有路径、404.左叶子之和、222.完全二叉树的节点个数

参考文献链接:代码随想录

本人代码是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;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值