代码随想录算法刷题训练营第十二天 | 101. 对称二叉树 226. 翻转二叉树 104.二叉树最大深度 111.二叉树最小深度

递归的实现就是:每一次递归调用都会把函数的局部变量、参数值和返回地址等压入调用栈中 

 101. 对称二叉树

题目链接:. - 力扣(LeetCode)

文章讲解:代码随想录 (programmercarl.com)

视频讲解:代码随想录算法公开课 | 最强算法公开课 | 代码随想录

 思路:对称二叉树是关于中线轴对称,左子树的左孩子和右子树的右孩子相等

可以用递归法:

    public boolean compare(TreeNode left, TreeNode right) {
        if(left == null && right != null) return false;
        if(left != null && right == null) return false;
        if(left == null && right == null) return true;
        if(left.val != right.val) return false;
        boolean inside = compare(left.right,right.left);
        boolean outside = compare(left.left,right.right);
        return inside && outside;
    }

终止条件是左右结点同时为空(true)或者有一个为空(false),或者值不等(false) 

单层递归逻辑是: 内侧相等,外侧相等;要让对应的孩子都能比较一下

转化为迭代法: 

        while(!queue.isEmpty()) {
            TreeNode leftNode = queue.poll();
            TreeNode rightNode = queue.poll();
            if(leftNode == null && rightNode == null) continue;
            if(leftNode == null || rightNode == null || (leftNode.val != rightNode.val)) return false;
            queue.offer(leftNode.left);
            queue.offer(rightNode.right);
            queue.offer(leftNode.right);
            queue.offer(rightNode.left);
        }

处理出队的前两个,让前两个是要比较的那两个 

226. 翻转二叉树

题目链接:. - 力扣(LeetCode)

文章讲解:代码随想录 (programmercarl.com)

视频讲解: 代码随想录算法公开课 | 最强算法公开课 | 代码随想录

 思路:把二叉树所有的子树都翻转,可以用递归的方法,也可以用迭代法

递归法:确定参数返回值;终止条件;单层递归逻辑;

        TreeNode temp;
        temp = node.left;
        node.left = node.right;
        node.right = temp;
        reverse(node.left);
        reverse(node.right);

104.二叉树最大深度

题目链接:. - 力扣(LeetCode)

文章讲解:代码随想录 (programmercarl.com)

视频讲解:​​​​​​​代码随想录算法公开课 | 最强算法公开课 | 代码随想录

 思路:高度是当前结点到叶子结点的最大海拔;深度是根节点到最远叶子结点的海拔

可以用递归和层序遍历

    //递归
    public void getDepth(TreeNode node, int depth) {
        result = result > depth ? result : depth; //最大深度
        if(node.left == null && node.right == null)return;
        if(node.left != null) getDepth(node.left,depth+1);
        if(node.right != null) getDepth(node.right,depth+1);
        return;
    }

 n叉树同理;

递归的实现就是:每一次递归调用都会把函数的局部变量、参数值和返回地址等压入调用栈中

        层序遍历
        Queue<TreeNode> queue = new LinkedList<>();
        queue.offer(root);
        while(!queue.isEmpty()) {
            int size = queue.size();
            result++;
            for(int i=0;i<size;i++) {
                TreeNode temp = queue.poll();
                if(temp.left != null)queue.offer(temp.left);
                if(temp.right != null)queue.offer(temp.right);
            }
        
        }

111.二叉树最小深度

题目链接:​​​​​​​. - 力扣(LeetCode)

文章讲解:代码随想录 (programmercarl.com)

视频讲解:​​​​​​​​​​​​​​代码随想录算法公开课 | 最强算法公开课 | 代码随想录

 思路:也可以用递归和层序遍历

        层序遍历
        while(!queue.isEmpty()){
            size = queue.size();
            deep++;
            while(size>0){
                TreeNode node = queue.poll();
                if(node.left!=null)queue.offer(node.left);
                if(node.right!=null)queue.offer(node.right);
                if((node.left==null)&&(node.right==null)){
                    return deep;
                }
                size--;
            }
        }

递归时有一个坑,如果左子树为空,右子树不为空,最小深度就是1+右子树深度

int leftDepth = getDepth(node->left);           // 左
int rightDepth = getDepth(node->right);         // 右
                                                // 中
// 当一个左子树为空,右不为空,这时并不是最低点
if (node->left == NULL && node->right != NULL) { 
    return 1 + rightDepth;
}   
// 当一个右子树为空,左不为空,这时并不是最低点
if (node->left != NULL && node->right == NULL) { 
    return 1 + leftDepth;
}
int result = 1 + min(leftDepth, rightDepth);
return result;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值