二叉树的基础练习(Java)

题目:

1. 二叉树的前序遍历
2. 二叉树中序遍历 
3. 二叉树的后序遍历 
4. 检查两颗树是否相同
5. 另一颗树的子树
6. 二叉树最大深度
7. 判断一颗二叉树是否是平衡二叉树
8. 对称二叉树

代码:


import java.util.ArrayList;
import java.util.List;

class TreeNode {
    int val;
    TreeNode left;
    TreeNode right;
    public TreeNode(int x) {
        val = x;
    }
}

public class Test {
    //前序遍历
    public List<Integer> preorderTraversal(TreeNode root) {
        List<Integer> list = new ArrayList<>();
        // 空树返回一个空的 List (元素个数为 0, 但是不是 null)
        if(root == null){
            return list;
        }
        // 访问根节点, 此处的访问操作, 把元素 add 到 List 中
        list.add(root.val);
        // 递归遍历左子树, 把左子树的遍历结果加入到 List 中
        list.addAll(preorderTraversal(root.left));
        // 递归遍历右子树, 把右子树的遍历结果加到 List 中
        list.addAll(preorderTraversal(root.right));
        return list;
    }
    //中序遍历
    public List<Integer> inorderTraversal(TreeNode root) {
        List<Integer> list = new ArrayList<>();
        // 空树返回一个空的 List (元素个数为 0, 但是不是 null)
        if(root == null){
            return list;
        }
        // 递归遍历左子树, 把左子树的遍历结果加入到 List 中
        list.addAll(inorderTraversal(root.left));
        // 访问根节点, 此处的访问操作, 把元素 add 到 List 中
        list.add(root.val);
        // 递归遍历右子树, 把右子树的遍历结果加到 List 中
        list.addAll(inorderTraversal(root.right));
        return list;
    }
    //后序遍历
    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;
    }


    //检查两颗二叉树是否相同
    public boolean isSameTree(TreeNode p, TreeNode q){
        //可以分为四种情况
        //1、p,q都为null;
        //2、p为null,q不为null;
        //3、q为null,p不为null;
        //4、p,q都不为null

        //两个树若为空树,那么认为这两个树相同
        if(p == null && q == null){
            return true;
        }
        //两个树若一个为空,一个不为空,肯定不同
        //if((p == null && q != null) || (p != null && q == null))
        if(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 s, TreeNode t) {
         if(s == null && t == null){
            return true;
        }
        if(s == null || t == null){
            return false;
        }
        boolean ret = true;
        if(s.val == t.val){
            ret = isSameTree(s,t);
        }
        return ret || isSubtree(s.left,t) || isSubtree(s.right,t);
    }
     //二叉树的最大深度
    public int maxDepth(TreeNode root) {
        //若二叉树为空,深度为0
        if(root == null){
            return 0;
        }
        //若二叉树的左右子树都为空,深度为1
        if(root.left == null && root.right == null){
            return 1;
        }
        //若二叉树左右子树都不为空,递归判断左右子树的深度
        int leftDepth = maxDepth(root.left);
        int rightDepth = maxDepth(root.right);
        return 1+(leftDepth>rightDepth?leftDepth:rightDepth);
    }
    

    //判断一个二叉树,是否是平衡二叉树
    // 平衡二叉树,左右子树的深度绝对值不大于于1
    public boolean isBalanced(TreeNode root) {
        //若二叉树为空,那么是一个平衡二叉树
        if(root == null){
            return true;
        }
        //若二叉树没有子树,那么也是一个平衡二叉树
        if(root.left == null && root.right == null){
            return true;
        }
        //若二叉树左右子树都不为空,递归判断左右子树的深度
        int leftDepth = maxDepth(root.left);
        int rightDepth = maxDepth(root.right);
        //若左右子树的深度绝对不小于1,那么一定不是一个平衡二叉树
        if(leftDepth - rightDepth >1 || leftDepth - rightDepth < -1){
            return false;
        }
        //否则,递归判断当前结点是否为平衡二叉树
        return isBalanced(root.left) && isBalanced(root.right);
    }
    
    //判断是否是对称二叉树
     public boolean isSymmetric(TreeNode root) {
        //空树一定对称
        if(root == null){
            return true;
        }
        //判断左右子树是否成对称
       return isMirrorTree(root.left,root.right);
    }
    public boolean isMirrorTree(TreeNode p, TreeNode q){
        //若两个子树为空,一定对称
        if(p == null && q == null){
            return true;
        }
        //若两个子树,一个为空,另一个不为空,一定不对称
        if(p == null || q == null){
            return false;
        }
        //若两个子树根节点不同,一定不对称
        if(p.val != q.val){
            return false;
        }
        return isMirrorTree(p.left,q.right) && isMirrorTree(p.right,q.left);
    }

   
}


(1)非递归定义 树(tree)是由n(n≥0)个结点组成的有限集合。n=0的树称为空树;n>0的树T: ① 有且仅有一个结点n0,它没有前驱结点,只有后继结点。n0称作树的根(root)结点。 ② 除结点外n0 , 其余的每一个结点都有且仅有一个直接前驱结点;有零个或多个直接后继结点。 (2)递归定义 一颗大树分成几个大的分枝,每个大分枝再分成几个小分枝,小分枝再分成更小的分枝,… ,每个分枝也都是一颗树,由此我们可以给出树的递归定义。 树(tree)是由n(n≥0)个结点组成的有限集合。n=0的树称为空树;n>0的树T: ① 有且仅有一个结点n0,它没有前驱结点,只有后继结点。n0称作树的根(root)结点。 ② 除根结点之外的其他结点分为m(m≥0)个互不相交的集合T0,T1,…,Tm-1,其中每个集合Ti(0≤i<m)本身又是一棵树,称为根的子树(subtree)。 2、掌握树的各种术语: (1) 父母、孩子与兄弟结点 (2) 度 (3) 结点层次、树的高度 (4) 边、路径 (5) 无序树、有序树 (6) 森林 3、二叉树的定义 二叉树(binary tree)是由n(n≥0)个结点组成的有限集合,此集合或者为空,或者由一个根结点加上两棵分别称为左、右子树的,互不相交的二叉树组成。 二叉树可以为空集,因此根可以有空的左子树或者右子树,亦或者左、右子树皆为空。 4、掌握二叉树的五个性质 5、二叉树的二叉链表存储。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值