今日数据结构----练习题一

数据结构每日一练【二叉树的基础面试题】

1.二叉树的前序遍历

题目链接
题目:给你二叉树的根节点 root ,返回它节点值的 前序 遍历。
代码

class Solution {
   public List<Integer> preorderTraversal(TreeNode root) {
      List<Integer> list =new ArrayList<>();
        if(root == null){
            return list;
        }
        list.add(root.val);
        System.out.print(root.val+" ");
        list.addAll(preorderTraversal(root.left));
        list.addAll(preorderTraversal(root.right));
        return list;
    }
}

运行结果:

输入测试用例:[1,null,2,3]
输出结果:[1,2,3]

add() 和 addAll()的区别:

  1. list.add():使用list.add()添加元素时,无论你添加的是什么类型数据,即使是另一个list集合,也只会增加一个元素;
  2. list.addAll():使用list.addAll()添加元素时,假如添加的是一个集合list3(2,7,8),则会把这个集合中的元素2,7,8都作为list集合的一个元素添加到list中;

2. 二叉树中序遍历

题目链接
题目:给定一个二叉树的根节点 root ,返回它的 中序 遍历。
代码

class Solution {
    public List<Integer> inorderTraversal(TreeNode root) {
    List<Integer> list =new ArrayList<>();
        if(root == null){
            return list;
            }
        list.addAll(inorderTraversal(root.left));
        list.add(root.val);
        System.out.print(root.val+" ");
        list.addAll(inorderTraversal(root.right));
        return list;
    }
}

运行结果:

输入:[1,null,2,3]
输出:[1,3,2]

3.二叉树的后序遍历

题目链接
题目:给定一个二叉树,返回它的 后序 遍历
代码

class Solution {
    public List<Integer> postorderTraversal(TreeNode root) {
            List<Integer> list =new ArrayList<>();
            if(root == null){
                return list;
            }
            list.addAll(postorderTraversal(root.left));
            list.addAll(postorderTraversal(root.right));
            list.add(root.val);
            return list;
    }
}

运行结果:

输入:[1,null,2,3]
输出:[3,2,1]

4.检查两颗树是否相同

题目链接
题目:给你两棵二叉树的根节点 p 和 q ,编写一个函数来检验这两棵树是否相同。如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。
代码

class Solution {
    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);
        
    }
}

运行结果:

输入
[1,2,3]
[1,2,3]
输出:true

5.另一颗树的子树

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

class Solution {
    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);
        
    }
    public boolean isSubtree(TreeNode root, TreeNode subRoot) {
        if(root == null){
            return false;
        }
           
        if(isSameTree(root,subRoot)){
            return true;
        }
        if(isSubtree(root.left,subRoot)){
            return true;
        }
        if(isSubtree(root.right,subRoot)){
            return true;
        }
        return false;

    }
}

6.二叉树最大深度

题目链接
题目:给定一个二叉树,找出其最大深度
代码

class Solution {
    public int maxDepth(TreeNode root) {
    //如果是空树,深度为0
        if(root == null){
            return 0;
        }
    //定义两个变量分别计算根节点左边,和右边的深度
        int maxLeft = maxDepth(root.left);
        int maxRight = maxDepth(root.right);
        if(maxLeft>maxRight){
            return maxLeft+1;
        }else{
            return maxRight+1;
        }

    }
}

7.判断平衡二叉树

题目链接
题目:给定一个二叉树,判断它是否是高度平衡的二叉树。本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1
代码

class Solution {
    public int maxDepth(TreeNode root) {
           if(root == null){
            return 0;
        }
        int maxLeft = maxDepth(root.left);
        int maxRight = maxDepth(root.right);
        if(maxLeft>maxRight){
            return maxLeft+1;
        }else{
            return maxRight+1;
        }
    }
    public boolean isBalanced(TreeNode root) {
        if(root == null){return true;}
        int depthL = maxDepth(root.left);
        int depthR = maxDepth(root.right);
        return Math.abs(depthL-depthR)<=1 && isBalanced(root.left) && isBalanced(root.right);
    }
}

8.对称二叉树

题目链接
题目:给定一个二叉树,检查它是否是镜像对称的。
代码

class Solution {
     public boolean isSametree(TreeNode p,TreeNode q) {
     //p是root的左节点,q是root的右节点
         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.right) && isSametree(p.right,q.left);

    }
    public boolean isSymmetric(TreeNode root) {
        if(root == null){
            return true;
        }
        return isSametree(root.left,root.right);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值