二叉树练习题

本文介绍了关于二叉树的一系列经典算法问题,包括获取节点个数、叶子节点数、第K层节点数、树的高度、查找特定值、判断完全二叉树、比较树的相似性、寻找子树、最大深度、平衡二叉树、对称二叉树等,并提供了相关链接和解题思路。
摘要由CSDN通过智能技术生成

1. 获取树中节点的个数

int count = 0;
int size(TreeNode root){
   
    if (root == null){
   
        return 0;
    }
    count++;
    return size(root.left)+size(root.right);
}
/**
 * 子问题思路
 */
int size1(TreeNode root){
   
    if (root == null) return 0;
    //左子树和右子树之和+根节点
    return size1(root.left)+size1(root.right)+1;
}

2. 获取叶子节点的个数 - (遍历思路、子问题思路)

  • 遍历思路:遍历到叶子结点,就让计数器++
int leafCount = 0;
void getLeafNodeCount(TreeNode root){
   
    if(root == null){
   
        return;
    }
    //左子树和右子树都为null时,是叶子结点
    if (root.left == null && root.right ==null){
   
        leafCount++;
    }
    //递归左子树和右子树
    getLeafNodeCount(root.left);
    getLeafNodeCount(root.right);
  • 子问题思路 :左树叶子数 +右树叶子数 = 整棵树的叶子
int leafCount1 = 0;
int getLeafNodeCount1(TreeNode root) {
   
    if (root == null) {
   
        return 0;
    }
    if (root.left == null &&root.right == null){
   
        //当前的root没有子树,自己就是叶子节点
        return 1;
    }
    return getLeafNodeCount1(root.left) + getLeafNodeCount1(root.right);
}

3. 获取第K层节点的个数

  • 子问题思路:是根节点的第k层,也就是第二层结点的第k-1层
public int getKLevelNodeCount(TreeNode root,int k){
   
    if (root == null || k <= 0){
   
        return 0;
    }
    if (k == 1){
    //当k=1时,第一层
        return 1;
    }
    //k不为1时:递归
    return getKLevelNodeCount(root.left,k-1) + getKLevelNodeCount(root.right,k-1);
}

4. 获取二叉树的高度

  • 子问题思路:左树的高度和右树的高度 取最大值 然后+1(根节点)= 整棵树的高度
  • 下面的函数时间复杂度:O(n) (看递归的次数,每个结点都递归,次数为n)
  • 空间复杂度:O(k) k=log2(n) (空间复杂度为数的高度)
int getHeight2(TreeNode root) {
   
    if(root == null){
   
        return 0;
    }
    int leftHeight = getHeight2(root.left);
    int rightHeight = getHeight2(root.right);
    return leftHeight>=rightHeight ? leftHeight+1 : rightHeight+1;


}
int getHeight(TreeNode root){
   
    if(root == null){
   
        return 0;
    }
    //比较左树高度和右树高度,取最大值
    int leftHeight = getHeight(root.left);
    int rightHeight = getHeight(root.right);
    return leftHeight > rightHeight ? leftHeight+1 : rightHeight+1;

   //return getHeight(root.left) > getHeight(root.right)? (getHeight(root.left)+1):(getHeight(root.right)+1);
   //递归的次数太多了,重复计算了好多次,err
        //超出规定的运行时间:1.死循环 2.递归的次数太多了
}

5. 检测值为value的元素是否存在

TreeNode find(TreeNode root,char val) {
   
    if (root == null) return null;
    if (root.val == val){
   
        return root;
    }
    TreeNode ret = find(root.left,val);
    if(ret!=null){
   
        return ret;
    }
    ret = find(root.right,val); //如果左子树没有值为value的元素,看看右子树
    if (ret != null){
   
        return ret;
    }
    return null;
}

6. 判断一棵树是不是完全二叉树

  • 思路:root为空返回true,不为空时,建立一个队列,将root放入队列,
  • 队列不为空时,每次取出队列队头元素,对头元素不为null,则加入对头元素的左子树和右子树,为null则中止循环
  • 之后,队列不为空时,检测队列中所有元素,如果都是null则为true,如果有别的元素,则为false
{
   
    if(root == null){
   
        return true;
    }
    //队列
    Queue<TreeNode> queue = new LinkedList<>();
    queue.offer(root);//将根入队列
    //循环
    while (!queue.isEmpty()){
   // 队列不为空
        TreeNode cur = queue.poll(); //取出队头元素给cur
        if (cur != null){
     //当取出的队头不为null时,加入其左子树和右子树两个元素
            queue.offer(cur.left);
            queue.offer(cur.right);
        }else {
   
            break; //为null时,中止循环
        }
    }
    //看队列剩下的元素是否都为null,如果有不为null的元素,那么就不是完全二叉树
    while(!queue.isEmpty()){
   
        TreeNode top = queue.peek();
        if(top != null){
   
            return false;
        }
        queue.poll();
    }
    return true;
}

7. 相同的树

时间复杂度:O(min(M,N))

  • https://leetcode.cn/problems/same-tree/
public boolean isSameTree(TreeNode p, TreeNode q) {
   
    if(p == null && q == null){
    //p和q都为空
        return true;
    }
    if(p == null && q!=null || p!=null && q == null){
    //p为空或者q为空
        return false;
    }
    if(p.val != q.val)
(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、付费专栏及课程。

余额充值