二叉树的经典面试题(你值得拥有)

二叉树的经典面试题


再之前我已经发布有关二叉树的基础知识: 二叉树的详解,那么接下来我将会为你们讲一些经典并且常见的二叉树面试题

初阶面试题

二叉树的最大深度

题:二叉树的最大深度
在这里插入图片描述
解题思路:该题可以使用最为简单的递归方法进行实现,如当根结点为空时返回0,如果不是则继续将其左孩子和右孩子进行递归;
递归如图:
在这里插入图片描述
代码如下:

class Solution {
    public int maxDepth(TreeNode root) {
        if(root==null){
        //如果该结点为空则返回0
            return 0;
        }
        int leftDepth=maxDepth(root.left);//递归该结点的左孩子
        int rightDepth=maxDepth(root.right);//递归该结点的右孩子
        if(leftDepth>rightDepth){//比较左右的深度,谁大就返回其深度+1;
            return leftDepth+1;
        }
        return rightDepth+1;
    }
}

在这里插入图片描述
其时间复杂度为O(n):其中n是二叉树的结点数并且每一个结点都会被遍历一次,空间复杂度为O(high):其中high是二叉树的高度,因为每使用一次递归需要开辟一个栈空间,而栈的开辟空间取决于递归的深度。

平衡二叉树

平衡二叉树
在这里插入图片描述
解题思路:由题可知,平衡二叉树指二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。那么我们可以使用递归的方法先求出该节点左子树的深度和右子树的深度,再看其绝对值之差是否小于等于1。
代码如下:

class Solution {
   public  int maxDepth(TreeNode root){
        if(root==null){
            return 0;
        }
        int left=maxDepth(root.left);
        int right=maxDepth(root.right);
        return Math.max(left,right)+1;
    }
    public  boolean isBalanced(TreeNode root) {
        if (root==null){
            return true;
        }
        int left=maxDepth(root.left);
        int right=maxDepth(root.right);
        if (Math.abs(left-right)<=1&&isBalanced(root.right)&&isBalanced(root.left)){
            return true;
        }
        return false;
    }

在这里插入图片描述
其时间复杂度为O(n*n):n为二叉树的结点个数。
空间复杂度为O(n):n 是二叉树中的节点个数。空间复杂度主要取决于递归调用的层数,递归调用的层数不会超过 n。
为了提高时间复杂度效率,可以使用自底向上的递归方法:该方法是先递归判断左右子树是否平衡,最后判断该结点是否为平衡树,如果为则返回高度否则则返回-1
代码如下

class Solution {
public int maxDepth(TreeNode root){
        if(root==null){
            return 0;
        }
        int left=maxDepth(root.left);
        int right=maxDepth(root.right);
        if(left>=0&&right>=0&&Math.abs(left-right)<=1){
            return Math.max(left,right)+1;
        }
        return -1;
    }
    public  boolean isBalanced(TreeNode root){
        return maxDepth(root)>=0;
    }
}

在这里插入图片描述
优化后时间复杂度为O(n)

相同的树

相同的树
在这里插入图片描述
解题思路:该题使用递归方法可以简单解决,首先我们应该判断该节点是否为空 1.如果p,q都为空则返回true 2.如果p,q只有一个树为空则返回false. 如果p的值不等于q的值则返回false。
核心代码如下:

class Solution {
    public boolean isSameTree(TreeNode p, TreeNode q) {
        if(p==null&&q==null){//如果p,q都为空则返回true
            return true;
        }
        if(p==null||q==null){//如果p,q只有一个树为空则返回false
            return false;
        }
        if(p.val!=q.val){//p,q的值不相等
            return false;
        }
        if(isSameTree(p.left,q.left)&&isSameTree(p.right,q.right)){
        //递归
            return true;
        }
        return false;
    }
}

在这里插入图片描述

另一棵树的子树

另一棵树的子树
解题思路:其解题方法与上面的题:相同的树大体一样,不过该题得先判断subRoot的根结点是否为root 的根结点还是为root的左孩子或者为root的右孩子。

class Solution {
     public boolean isSameTree(TreeNode p, TreeNode q) {
        if(p==null&&q!=null||p!=null&&q==null){
            return false;
        }
        if(p==null&&q==null){
            return true;
        }
        if(p.val!=q.val){
            return false;
            
        }
        if(isSameTree(p.left,q.left)&&isSameTree(p.right,q.right))
        {
            return true;
        }
        return false;
    }
    public boolean isSubtree(TreeNode root, TreeNode subRoot) {
        if(root==null){//判断root是否为空
            return false;
        }
        if(isSameTree(root,subRoot)){
        //判断subRoot的根结点是否为root 的根结点
            return true;
        }
        if (isSubtree(root.left,subRoot)){
        //subRoot的根结点是否为root 的左孩子
            return true;
        }
        if(isSubtree(root.right,subRoot)){
        //subRoot的根结点是否为root 的右孩子
            return true;
        }
        return false;}
}

在这里插入图片描述

对称二叉树

对称二叉树
在这里插入图片描述
解题思路:先判断该树是否为空,再利用递归方法判断左孩子和右孩子的值是否相等。
代码如下:

class Solution {
    public boolean isSymmetricChild(TreeNode leftTree, TreeNode rightTree){
        if(leftTree==null&&rightTree!=null||leftTree!=null&&rightTree==null){
            return false;
        }
        if(leftTree==null&&rightTree==null){
            return true;
        }
        if (leftTree.val!=rightTree.val){
            return false;
        }
        return isSymmetricChild(leftTree.left,rightTree.right)&&isSymmetricChild(leftTree.right,rightTree.left);
    }
    public boolean isSymmetric(TreeNode root) {
        if (root==null){
            return false;
        }
        return isSymmetricChild(root.left,root.right);
    }
}

在这里插入图片描述

二叉树的镜像

二叉树的镜像
在这里插入图片描述
解题思路:
代码如下:使用递归方法,先判断该树是否为空,再使用递归方法交换左右子树最后返回根节点。

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param pRoot TreeNode类 
     * @return TreeNode类
     */
    public TreeNode Mirror (TreeNode pRoot) {
        // write code here
        if(pRoot==null){
            return null;
        }
        TreeNode root=new TreeNode(pRoot.val);
        root.left=Mirror(pRoot.right);
        root.right=Mirror(pRoot.left);
        return root;
    }
}

在这里插入图片描述

进阶面试题

把二叉树打印成多行

把二叉树打印成多行
在这里插入图片描述
解题思路:由题可知,其根本是让我们进行二叉树的层次遍历,则我们需要使用队列为了打印出多行则需要将遍历后的值放入集合中
代码如下:

import java.util.*;


/*
public class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;

    public TreeNode(int val) {
        this.val = val;

    }

}
*/
public class Solution {
    ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
     ArrayList<ArrayList<Integer>> list=new ArrayList<>();
            if (pRoot==null){
                return list;
            }
            TreeNode root=pRoot;
            Queue<TreeNode> queue=new LinkedList<>();
            queue.offer(root);
            while (!queue.isEmpty()){
                    int size= queue.size();
                    ArrayList<Integer> list1=new ArrayList<>();
                    while (size>0){
                        root=queue.poll();
                        list1.add(root.val);
                        if (root.left!=null){
                            queue.offer(root.left);
                        }
                        if(root.right!=null){
                            queue.offer(root.right);
                        }
                        size--;
                }
                list.add(list1);
            }
            return list;
    }
    
}

在这里插入图片描述

二叉树的最近公共祖先

二叉树的最近公共祖先
在这里插入图片描述
解题思路:先判断该根结点是否为空,然后在判断根节点是否等于p或者q,再进行递归左右子树,最后判断左右的数是否为空,都非空返回root,只有一个是非空则返回该结点否则返回空。
代码如下:

class Solution {
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        if(root==null){
            return null;
        }
         if(root==p||root==q){
             return root;
         }
         TreeNode leftTree=lowestCommonAncestor(root.left,p,q);
         TreeNode rightTree=lowestCommonAncestor(root.right,p,q);
         if(leftTree!=null&&rightTree!=null){
             return root;
         }
         if(leftTree==null&&rightTree!=null){
             return rightTree;
         }
         if(leftTree!=null&&rightTree==null){
             return leftTree;
         }
         return null;
    }
}

在这里插入图片描述

根据二叉树创建字符串

根据二叉树创建字符串
解题思路:该题主要考查先序遍历的实现,不过其也要注意括号的添加,当左孩子为空而右孩子为非空则加一对括号,如果右孩子为空而左孩子为非空则忽略这一对括号。
代码如下:

class Solution {
    public void tree2strChild(TreeNode t,StringBuilder sb){
        if(t==null){
            return;
        }
        sb.append(t.val);
        if(t.left==null){
            if(t.right!=null){
            sb.append("()");
            }
            else{
                return;
            }  
        }
        else if(t.left!=null){
            sb.append("(");
            tree2strChild(t.left,sb);
            sb.append(")");
        }
        if(t.right==null){
            return;
        }
        else{
            sb.append("(");
            tree2strChild(t.right,sb);
            sb.append(")");
        }
    }
    public String tree2str(TreeNode root) {
         if(root==null){
             return null;
         }
         StringBuilder sb=new StringBuilder();
         tree2strChild(root,sb);
         return sb.toString();
    }
}

在这里插入图片描述

总结

上述的这些树题,几乎百分之90的题都是使用递归完成,这就要考查我们的思维。
这里也有部分面试题希望对你们有帮助
从前序与中序遍历序列构造二叉树
二叉搜索树与双向链表
在这里插入图片描述

  • 72
    点赞
  • 67
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 53
    评论
Python二叉树面试题有很多种,以下是其中几个常见的面试题: 1. 二叉树的最大深度:这个问题要求计算给定二叉树的最大深度。可以使用递归的方法来解决,递归函数的定义是返回当前节点的深度,递归终止条件是节点为空时返回0,递归过程中比较左右子树的深度并返回较大值加1。时间复杂度为O(n),空间复杂度为O(n)。 2. 二叉树的前序遍历:这个问题要求按照前序遍历的顺序输出二叉树的节点值。可以使用递归或迭代的方法来解决。递归方法的思路是先输出当前节点的值,然后递归遍历左子树,最后递归遍历右子树。迭代方法可以使用栈来辅助实现,把根节点压入栈中,然后循环弹出栈顶节点,输出其值,并将其右子节点和左子节点依次压入栈中。时间复杂度为O(n),空间复杂度为O(n)。 3. 二叉树的层序遍历:这个问题要求按照层序遍历的顺序输出二叉树的节点值。可以使用队列来辅助实现。首先将根节点入队,然后循环直到队列为空,每次从队列中取出一个节点,输出其值,并将其左右子节点依次入队。时间复杂度为O(n),空间复杂度为O(n)。 以上是几个常见的Python二叉树面试题的解法,根据具体的问题要求和输入条件选择合适的解法即可。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [【编程之路】面试必刷TOP101:二叉树系列(23-30,Python实现)](https://blog.csdn.net/be_racle/article/details/125531755)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [【面试题8】二叉树的下一个节点](https://download.csdn.net/download/weixin_38589168/14035034)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 53
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

文墨轩

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

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

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

打赏作者

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

抵扣说明:

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

余额充值