首页 > 其他分享 >代码随想录刷题Day 14 二叉树part02

代码随想录刷题Day 14 二叉树part02

时间:2024-07-16 22:53:15浏览次数:9  
标签:tmp right return 14 随想录 二叉树 null root left

226. 翻转二叉树

//这道题其实就是遍历二叉树,然后交换每个节点的左右子节点即可。这里我就使用了一个栈来存储需要遍历的节点,每次循环弹出一个,然后交换其左右子节点就好了
class Solution {
    public TreeNode invertTree(TreeNode root) {
        Stack<TreeNode> stack = new Stack<>();
        if(root == null) return root;
        stack.push(root);
        while(!stack.isEmpty()){
            TreeNode tmp = stack.pop();
            if(tmp.left != null) stack.push(tmp.left);
            if(tmp.right != null) stack.push(tmp.right);
            TreeNode t = tmp.left;
            tmp.left = tmp.right;
            tmp.right = t;
        }
        return root;
    }
}

101. 对称二叉树

class Solution {  //我这个写法有点丑陋,后面会给出更好的解法
    public boolean isSymmetric(TreeNode root) {
        List<Integer> levelVal = new ArrayList<>();  //相当于层序遍历,把一层的所有值存起来,如果对应位置为null,则填充一个不可能是真正节点值的一个数字,最后判断这层的值是否是对称的即可
        if(root == null) return true;
        Queue<TreeNode> queue = new LinkedList<>();
        queue.offer(root);
        while(!queue.isEmpty()){
            int size = queue.size();
            for(int i = 0; i < size; i++){ //遍历当前层,填充下一层的值
                TreeNode tmp = queue.poll();
                if(tmp.left != null) {queue.offer(tmp.left); levelVal.add(tmp.left.val);}
                else{ levelVal.add(-200); }  //没有左孩子,则在左孩子的位置填一个非法值
                if(tmp.right != null) {queue.offer(tmp.right); levelVal.add(tmp.right.val);}
                else{ levelVal.add(-200); }  //同理
            }
            if(!isSymmetricLevel(levelVal)) return false;
            levelVal.clear(); //记得要清空
        }
        return true;
    }

    public boolean isSymmetricLevel(List<Integer> levelVal){
        ArrayList<Integer> reverse = new ArrayList();
        for(Integer i: levelVal){
            reverse.add(0, i);
        }
        return levelVal.equals(reverse);
    }
}

怎么理解题意中的对称呢,对于递归版本中,我是这么理解的,其实位于对应对称位置处的节点必须相同。比如对于第二层而言,两个2位置处的节点相同;对于第三层,则是两个3位置处节点相同,两个4处相同。这个相同指的是可以都是null或者两者的val必须相同。

class Solution {  //递归版本题解,确实优雅
    
    public boolean isSymmetric(TreeNode root) {
        if(root == null) return true;
        return compare(root.left, root.right); //比较对应位置处节点是否完全相同
    }

    public boolean compare(TreeNode left, TreeNode right){
        if(left == null && right == null) return true;
        if(left == null && right != null || left != null && right == null) return false;
        if(left.val != right.val) return false;
        boolean b1 = compare(left.left, right.right);  //比较外侧的对称位置
        boolean b2 = compare(left.right, right.left);  //比较内测的对称位置
        return b1 && b2;
    }
}

标签:tmp,right,return,14,随想录,二叉树,null,root,left
From: https://www.cnblogs.com/12sleep/p/18306281

相关文章

  • 【Java--数据结构】二叉树
    欢迎关注个人主页:逸狼创造不易,可以点点赞吗~如有错误,欢迎指出~树结构树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合注意:树形结构中,子树之间不能有交集,否则就不是树形结构常见概念  节点的度:一个节点含有子树的个数,如A的度为6......
  • 代码随想录day27 递增子序列 | 全排列 | 全排列 II
    递增子序列递增子序列解题思路用set来去重,之后每次一个节点存入时与前一个节点进行大小比较,如果小就不存了,跳过剩余的回溯过程知识点回溯,去重心得在考虑去重的时候忘记了使用C++的数据结构set,得记下这个方法全排列全排列解题思路在回溯迭代的时候传入了一个统计数组元......
  • (20240714)材料科学基础(2)晶体结构
    一、晶体左侧CSH水化硅酸钙,右侧板状托贝莫来石1.晶体是离子、原子、或分子按一定的空间结构排列组成的固体,其质点在空间的分布具有周期性和对称性,因此晶体具有规则的外形。2.空间点阵:把晶体中质点(离子、原子、或分子)的中心用直线连起来构成的空间格架即空间点阵,简称晶格3.......
  • 利用递归的二叉树的先序,中序,后序遍历
    一.常见的二叉树的遍历①先序遍历:先访问根节点,再访问左右子树(根左右)③中序遍历:先访问左子树,再访问根节点,最后访问右子树(左根右)③后序遍历:先访问左右子树,再访问根节点(左右根)先定义二叉树的数据结构:typedefcharElemType;typedefstructBTNode{ ElemTypedata; ......
  • 代码随想录算法训练营第十四天 | 226.翻转二叉树、101. 对称二叉树、 104.二叉树的最
    226.翻转二叉树题目:.-力扣(LeetCode)思路:前序遍历代码:classSolution{public:TreeNode*invertTree(TreeNode*root){if(root!=NULL){swap(root->left,root->right);invertTree(root->left);invertTree(root->right);}......
  • 代码随想录算法训练营第十一天 | 150. 逆波兰表达式求值、 239. 滑动窗口最大值、347.
    150.逆波兰表达式求值题目:.-力扣(LeetCode)思路:遇到数字进栈,遇到符号出栈运算。代码:classSolution{public:intevalRPN(vector<string>&tokens){stack<longlong>sta;for(strings:tokens){if(s=="+"||s=="-"||s=="*"......
  • 代码随想录算法训练营第九天 | 151.翻转字符串里的单词、卡码网:55.右旋转字符串、28.
    151.翻转字符串里的单词题目:.-力扣(LeetCode)思路:用快慢双指针重置空格,先整体翻转再局部翻转代码:classSolution{public:voidremoveSpace(string&s){intslow=0;for(intfast=0;fast<s.size();fast++){if(slow!=0&&s[fast]!='')......
  • 代码随想录算法训练营第八天 | 344.反转字符串、541. 反转字符串II、卡码网:54.替换数
    344.反转字符串题目:.-力扣(LeetCode)思路:用swap遍历一个循环就行了。代码:classSolution{public:voidreverseString(vector<char>&s){for(inti=0;i<s.size()/2;++i){swap(s[i],s[s.size()-i-1]);}}};541.反转字符串II题目:.-力扣(L......
  • 「代码随想录算法训练营」第十二天 | 二叉树 part2
    226.翻转二叉树题目链接:https://leetcode.cn/problems/invert-binary-tree/题目难度:简单文章讲解:https://programmercarl.com/0226.翻转二叉树.html视频讲解:https://www.bilibili.com/video/BV1sP4y1f7q7题目状态:通过个人思路:类似二叉树的层序遍历的变形,创建一个队列,先......
  • CF141B Hopscotch 题解
    Hopscotch题面翻译有nnn个形状和大小都一致的正方体积木,积木堆积的样式是第一层只有一个正方体,然后上面就开始循环了,循环体为:第一层是一个正方体,第二层是两个正方体。......