二叉树面试题(高频)

本文详细讲解了如何检查两棵树是否相同,判断子树是否存在,计算最大深度,识别平衡二叉树,以及验证对称性。通过递归和层次遍历方法,提供了实用的代码示例和算法思路。

目录

1. 检查两颗树是否相同

1.1题目描述

1.2思考过程

1.3代码 

2. 另一颗树的子树

2.1题目描述

2.2思考过程

2.3代码

3. 二叉树最大深度

3.1题目描述

3.2思考过程

 3.3代码

4. 判断一颗二叉树是否是平衡二叉树

4.1题目描述

4.2思考过程

4.3代码

5. 对称二叉树

5.1题目描述

5.2思考过程

 5.3代码

6.二叉树的分层遍历

6.1题目描述

6.2思考过程

 6.3代码

7.二叉树的构建及遍历

7.1题目描述

7.2思考过程

7.3代码 


1. 检查两颗树是否相同

OJ链接

1.1题目描述

给你两棵二叉树的根节点 pq ,编写一个函数来检验这两棵树是否相同。

如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。


1.2思考过程


1.3代码 

    public boolean isSameTree(TreeNode p, TreeNode q) {
        if(p==null&&q==null){
            return true;
        }
        if((p==null&&q!=null)||(p!=null&&q==null)){
            return false;
        }
        if(p.val!=q.val){
            return false;
        }
        
        return isSameTree(p.left,q.left)&&isSameTree(p.right,q.right);
    }

首先这两个数的根节点都是空,就是相同的,返回true,如果一个空,另一个不为空,就说明不是,返回false,接着我们判断他两的值是否相等,不相等我们返回false,到这里,说明他们纸箱等,接着要判断他两的孩子节点是否相同,都相同就返回true,负责返回false,这里用递归来完成。


2. 另一颗树的子树

OJ链接

2.1题目描述

给你两棵二叉树 root 和 subRoot 。检验 root 中是否包含和 subRoot 具有相同结构和节点值的子树。如果存在,返回 true ;否则,返回 false 。

二叉树 tree 的一棵子树包括 tree 的某个节点和这个节点的所有后代节点。tree 也可以看做它自身的一棵子树。


2.2思考过程


2.3代码

    public boolean isSubtree(TreeNode root, TreeNode subRoot) {
        if(root==null||subRoot==null){
            return false;
        }
        if(isSameTree(root,subRoot)){
            return true;
        }

        return isSubtree(root.left,subRoot)||isSubtree(root.right,subRoot);
        
    }
    private boolean isSameTree(TreeNode p, TreeNode q) {
        if(p==null&&q==null){
            return true;
        }
        if((p==null&&q!=null)||(p!=null&&q==null)){
            return false;
        }
        if(p.val!=q.val){
            return false;
        }
        
        return isSameTree(p.left,q.left)&&isSameTree(p.right,q.right);
    }

 由于要判断树是否相同,我们可以调用刚写的代码来完成,首先判断两个数是否有空的,有就说明不是,返回false,接着判断这两个树是否相同,相同就说明是,返回true,最后判断他们的子树是否与目标树相同,有一个相同就说明是子树,返回true。


3. 二叉树最大深度

OJ链接

3.1题目描述

给定一个二叉树,找出其最大深度。

二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。

说明: 叶子节点是指没有子节点的节点。


3.2思考过程

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿拉蕾wjh

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值