二叉树解题

对称二叉树

 

  递归

    既然要检验是否对称,那么就是检验两个对称节点是否相同。也就是说,要实现检验一对对称结点的值是否相等的函数。然后再用递归的思想将左右儿子结点也一起检验了。

    代码实现

class Solution {
    public boolean isSymmetric(TreeNode root) {
        if(root==null) return true;
        return judge(root.left,root.right);
    }
    public boolean judge(TreeNode l,TreeNode r){
        if((l==null && r==null)){ return true;}
        if(l==null || r==null){ return false;}
        return l.val==r.val && judge(l.left,r.right) && judge(l.right,r.left);
    }
}

    在完成这个代码的时候出现了两个误区

  1. 第一次写的时候没有考虑全面,忽略了root为null的情况,我对边缘情况的处理一直很粗糙
  2. 对于l和r的多种情况处理时没有考虑完整。如果l和r都为null时,则不需要考虑儿子结点直接return就好了。第二个if语句是在第一个if语句不成立的情况下执行的,因此可以直接写一个or就完成情况处理。

迭代

    可以用一个队列来将递归改成迭代。在while语句中,将左结点的左儿子和右节点的右儿子放入队列,然后将左节点的右儿子和右节点的左儿子放入队列,下一次循环时取出队列的前两个元素。

    代码实现

class Solution {
    public boolean isSymmetric(TreeNode root) {
        if(root==null) return true;
        return judge(root,root);
    }
    public boolean judge(TreeNode l,TreeNode r){
        Queue<TreeNode> q = new LinkedList<TreeNode>();
        q.offer(l);
        q.offer(r);
        while(!q.isEmpty()){
            l=q.poll();
            r=q.poll();
            if(l==null && r==null){ continue;}
            if(l==null || r==null || l.val!=r.val) {return false;}

            q.offer(l.left);
            q.offer(r.right);

            q.offer(l.right);
            q.offer(r.left);
        }
        return true;
    }
}

  现在对于队列的使用还不是特别熟悉,等做多了应该就会掌握了吧  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我! 毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip毕设新项目-基于Java开发的智慧养老院信息管理系统源码+数据库(含vue前端源码).zip
重建二叉树是一道经典的二叉树问题,其解题思路如下: 1. 首先,我们需要根据前序遍历序列和序遍历序列来重建二叉树。前序遍历序列的第一个节点一定是二叉树的根节点,序遍历序列根节点左边的所有节点都属于二叉树的左子树,右边的所有节点都属于二叉树的右子树。 2. 我们可以通过前序遍历序列找到二叉树的根节点,然后在序遍历序列找到根节点的位置。根节点左边的所有节点都属于左子树,右边的所有节点都属于右子树。 3. 接下来,我们递归构建左子树和右子树。我们可以根据前序遍历序列和序遍历序列左右子树的节点数量确定左右子树的范围。 4. 重复以上步骤,直到遍历完整个序列,最终得到重建的二叉树。 下面是重建二叉树的代码实现,代码注释有详细的解释。 ```python class TreeNode: def __init__(self, val=0, left=None, right=None): self.val = val self.left = left self.right = right def buildTree(preorder, inorder): """ :type preorder: List[int] :type inorder: List[int] :rtype: TreeNode """ # 如果前序遍历序列和序遍历序列为空,返回None if not preorder or not inorder: return None # 前序遍历序列的第一个节点一定是二叉树的根节点 root_val = preorder[0] root = TreeNode(root_val) # 在序遍历序列找到根节点的位置 root_index = inorder.index(root_val) # 递归构建左子树和右子树 left_preorder = preorder[1:root_index+1] left_inorder = inorder[:root_index] left = buildTree(left_preorder, left_inorder) right_preorder = preorder[root_index+1:] right_inorder = inorder[root_index+1:] right = buildTree(right_preorder, right_inorder) # 将左右子树连接到根节点上 root.left = left root.right = right return root ``` 以上就是重建二叉树的详细解题思路和代码实现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值