7月算法训练------第十九天(二叉树)解题报告

这篇博客分享了两道关于二叉树的算法题解,第一题是958.二叉树的完全性检验,通过深度优先遍历和排序判断完全二叉树。第二题是剑指Offer26.树的子结构,通过递归比较节点值和子树结构来确定子结构是否存在。
摘要由CSDN通过智能技术生成

7月算法训练------第十九天(二叉树)解题报告

题目类型:二叉树
题目难度:简单

第一题、958. 二叉树的完全性检验

  1. 题目链接:958. 二叉树的完全性检验
  2. 思路分析:
    对这棵二叉树的节点进行编号,将根节点编为1,我们根据完全二叉树的性质,设当前节点的编号为n,二叉树的左节点为2n,右节点为2n+1,对二叉树进行深度优先遍历。我们用一个ArrayList存储这个二叉树的编号,然后对它进行排序,如果是完全二叉树,则二叉树的节点应该按1,2,3…间隔相差为1,进行递增。如果不是完全二叉树,则递增间隔不为1。
  3. 代码:
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    List<Integer> list;
    public boolean isCompleteTree(TreeNode root) {
        list = new ArrayList();
        dfs(root, 1);
        Integer[] a = list.toArray(new Integer[list.size()]);
        Arrays.sort(a);
        for(int i = 0; i < a.length; i++){
            if(i+1 != a[i]){
                return false;
            }
        }
        return true;
    }
    public void dfs(TreeNode root, int num){
        if(root == null){
            return ;
        }
        list.add(num);
        dfs(root.left, 2 * num);
        dfs(root.right, 2 * num + 1);
    }
}

第二题、剑指 Offer 26. 树的子结构

  1. 题目链接:剑指 Offer 26. 树的子结构
  2. 思路分析:
    按题意,如果B为空,则直接返回false;为了能使所有情况都能列举到,则将输入的由两个函数分别进行递归,如果只有一个函数进行递归,则不能列举所有情况,当节点值不一样时,则返回false,当节点值一样时,再进一步判断左节点和右节点的值是否一样。
  3. 代码:
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public boolean isSubStructure(TreeNode A, TreeNode B) {
        if(B == null){
            return false;
        }
        if(match(A, B)){
            return true;
        }
        if(A == null){
            return false;
        }
        return isSubStructure(A.left, B) || isSubStructure(A.right, B);
        // return match(A, B);
    }
    public boolean match(TreeNode A, TreeNode B){
        if(A == null && B == null){
            return true;
        }
        if(A != null && B == null){
            return true;
        }
        if(A == null && B != null){
            return false;
        }
        if(A.val == B.val){
            return match(A.left, B.left) && match(A.right, B.right);
        }else{
            return false;
            // return match(A.left, B) || match(A.right, B);
        }
        // return false;
        
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值