二叉树经典练习题(基础)-- JAVA

  1. 判定一棵树是否为完全二叉树
  2. 判定两棵树是否相同
  3. 判定两棵树是否有相同结构和节点值的子树
  4. 找出树的最大深度
  5. 判定一棵树是否为高度平衡的二叉树(一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1)
  6. 判定一棵树是否对称
  7. 判定一棵树是否镜像对称
import java.util.LinkedList;
import java.util.Queue;

class TreeNode {
    int val;
    TreeNode left;
    TreeNode right;

    TreeNode(int x) {
        val = x ;
    }

    static TreeNode build() {
        //通过build方法构建一棵树,返回树的根节点
        TreeNode A = new TreeNode('A');
        TreeNode B = new TreeNode('B');
        TreeNode C = new TreeNode('C');
        TreeNode D = new TreeNode('D');
        TreeNode E = new TreeNode('E');
        TreeNode F = new TreeNode('F');
        TreeNode G = new TreeNode('G');
        A.left = B;
        A.right = C;
        B.left = D;
        B.right = E;
        E.left = G;
        C.right = F;
        return A;
    }

    boolean isCompleteTree(TreeNode root) {
        //判定一棵树是否为完全二叉树:
        //1.先针对这个树进行层序遍历:
        //每个访问到的节点必须具备两个子树
        //如果只有右子树,则不是完全二叉树
        //直到最后一层无子树,则遍历结束
        if(root == null) {
            return true;
        }
        boolean isFirstStep = true;
        //开始层序遍历
        Queue<TreeNode> queue = new LinkedList<>();
        queue.offer((TreeNode) root);

        while(!queue.isEmpty()) {
            TreeNode cur = queue.poll();
        }
        return isFirstStep;
    }

    public boolean isSameTree(TreeNode s, TreeNode t) {
        //判断两棵树是否相同
        if(s == null && t == null) {
            return true;
        }
        if(s == null ||t == null){
            return false;
        }
        return s.val == t.val && isSameTree(s.left, t.left) && isSameTree(s.right, t.right);
    }
    public boolean isSubtree(TreeNode s, TreeNode t) {
        //给定两个非空二叉树 s 和 t,检验 s 中是否包含和 t 具有相同结构和节点值的子树。
        // s 的一个子树包括 s 的一个节点和这个节点的所有子孙。
        // s 也可以看做它自身的一棵子树
        if(s == null) {
            return false;
        }
        //先序遍历 s :判定s是否包含t
        return isSameTree(s, t) || isSubtree(s.left, t) || isSubtree(s.right, t);
    }

    public int maxDepth(TreeNode root) {
        //给定一个二叉树,找出其最大深度
        //二叉树的深度为根节点到最远叶子节点的最长路径上的节点数
        //ps: 叶子节点是指没有子节点的节点

        //最大深度 = 1 + max(左子树深度, 右子树深度)
        if(root == null) {
            return 0;
        }
        int leftDepth = maxDepth(root.left);
        int rightDepth = maxDepth(root.right);
        return 1 + (leftDepth > rightDepth ? leftDepth : rightDepth);
    }

    public boolean isBalanced(TreeNode root) {
        //给定一个二叉树,判断它是否是高度平衡的二叉树.
        //一棵高度平衡二叉树定义为:
        //一个二叉树每个节点的左右两个子树的高度差的绝对值不超过1.
        if(root == null) {
            return true;
        }
        if(root.left == null && root.right == null) {
            return true;
        }
        int left = maxDepth(root.left);
        int right = maxDepth(root.right);
        return (left - right <= 1 && left - right >= -1) && isBalanced(root.left) && isBalanced(root.right);
    }

    private boolean isMirrow(TreeNode t1, TreeNode t2) {
        //判定一棵树是否对称:
        //对应节点的值相同,左右子树刚好相反(与根节点无关)
        //左右子树的根节点值相等
        //&& 左子树.left 和右子树.right 是对称的
        //&& 左子树.right 和右子树.left 是对称的
        if(t1 == null && t2 == null) {
            return true;
        }
        if(t1 == null || t2 == null) {
            return false;
        }
        return (t1.val == t2.val) && isMirrow(t1.left, t2.right) && isMirrow(t1.right, t2.left);
    }
    public boolean isSymmetric(TreeNode root) {
        //给定一个二叉树,检查它是否是镜像对称的
        if(root == null) {
            return true;
        }
        return isMirrow(root.left, root.right);
    }
}


  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
基础数据结构Java编程中非常重要的一部分,练习题可以帮助我们巩固对这些数据结构的理解和使用。下面是一些常见的Java基础数据结构练习题: 1. 数组反转:编写一个方法,将给定的数组按照逆序进行排列。 2. 查找元素:编写一个方法,在给定的有序整数数组中查找指定元素,返回其索引;如果不存在,则返回-1。 3. 字符串反转:编写一个方法,将给定的字符串按照逆序进行排列。 4. 链表逆序:编写一个方法,将给定的单链表进行逆序排列。 5. 栈的应用:使用栈来检查给定的括号序列是否合法,例如{[()]}是合法的,而{[(])}是非法的。 6. 队列的应用:使用队列来实现热土豆游戏,每经过指定的时间,队列中的土豆将被传递给下一个人,最后队列中剩下的人即为胜者。 7. 哈希表应用:实现一个电话号码簿,可以添加、删除和查找联系人信息。 8. 树的遍历:实现二叉树的前序、中序和后序遍历算法。 9. 图的最短路径:使用Dijkstra算法求解给定图中两个节点的最短路径。 10. 排序算法:实现常见的排序算法,如冒泡排序、插入排序和快速排序。 通过这些练习题的学习和实践,我们可以巩固对基础数据结构的理解和运用,提高自己的编程能力。同时,这些题目也是我们面试和应聘工作中常见的考察点,掌握这些知识也有助于我们在求职过程中脱颖而出。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值