问题描述:
Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center).
For example, this binary tree [1,2,2,3,4,4,3]
is symmetric:
1 / \ 2 2 / \ / \ 3 4 4 3
But the following [1,2,2,null,3,null,3]
is not:
1 / \ 2 2 \ \ 3 3
Note:
Bonus points if you could solve it both recursively and iteratively.
原问题链接:https://leetcode.com/problems/symmetric-tree/
问题分析
这个问题相对来说还是比较简单的,这里针对两种解决方法讨论一下。
递归法
因为这里要判断一棵树是不是对称二叉树,所以它就有一个可以递归推导的属性。对于一个单独的根节点来说,如果它的左右子树都是空,说明它是对称的。如果它本身就是空的,那也是对称的。那么对于它同时有左右子树的情况呢?这里有一个更细节的地方,假设它有左右子树。那么它的对称属性要成立的话,必然要求它的左右子树的根节点相等,同时左子树的右子树要和右子树的左子树递归的相等。
按照这个递归的特性,我们可以得到如下的代码:
/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ public class Solution { public boolean isSymmetric(TreeNode root) { if(root == null || (root.left == null && root.right == null)) return true; return matches(root.left, root.right); } private boolean matches(TreeNode lNode, TreeNode rNode) { if(lNode == null && rNode == null) return true; if(lNode != null && rNode != null && lNode.val == rNode.val) return matches(lNode.left, rNode.right) && matches(lNode.right, rNode.left); return false; } }
迭代法
如果我们仔细观察的话,会发现对称二叉树还有一个有趣的特性可以利用。就是如果我们按照中序遍历的方式去遍历整个树,并将遍历过的元素记录下来的话。这个元素构成的访问序列必然是对称的。所以我们可以根据中序遍历后得到的结果去判断它是否对称来求得结果。
因为按照这个思路的实现相对比较简单,这里就不再详细赘述了。其实除了这种迭代法以外,还有一种稍微有一点变化的实现。这种方式比较有特点,在这里特别说明一下。就是在得到一棵树的根节点的左右两个子节点之后,我们对左右两棵子树分别进行层次序的遍历,只是左子树是从左到右的遍历,而右子树是从右到左的遍历。每次遍历的时候就将元素的子节点往队列里加。在每次从队列里取元素的时候则判断两边是否相等。这种方法也是间接利用了对称二叉树的特性。
详细的实现如下:
/** * Definition for binary tree * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ public class Solution { public boolean isSymmetric(TreeNode root) { if(root == null) return true; Queue<TreeNode> q1 = new LinkedList<TreeNode>(); Queue<TreeNode> q2 = new LinkedList<TreeNode>(); q1.add(root.left); q2.add(root.right); while(!q1.isEmpty() && !q2.isEmpty()) { TreeNode left = q1.remove(); TreeNode right = q2.remove(); if(left == null && right == null) continue; if(left == null || right == null) return false; if(left.val != right.val) return false; q1.add(left.left); q1.add(left.right); q2.add(right.right); q2.add(right.left); } return true; } }
相关推荐
java java_leetcode-101-symmetric-tree
python python_leetcode题解之101_Symmetric_Tree
tree node. * function TreeNode(val) { * this.val = val; * this.left = this.right = null; * } */ /** * @param { TreeNode } root * @return { boolean } */ var isSymmetric = function ( root ) { if ( root ...
js js_leetcode题解之101-symmetric-tree.js
leetcode 树节点leetcode 测试 仅使用适用于python 方便本地测试,ListNode和TreeNode类型 # filename leetcode.py from leetcode_test ...isSymmetric(self, ...symmetric(left, ...tree = TreeNode.create
在LeetCode上,第101题被称为“对称二叉树”(Symmetric Tree)。这是一道数据结构与算法问题,主要考察的是二叉树的遍历和比较。题目要求编写一个函数,判断给定的二叉树是否是对称的。对称二叉树的定义是:如果一...
* [Binary Search Tree](https://github.com/kamyu104/LeetCode#binary-search-tree) * [Breadth-First Search](https://github.com/kamyu104/LeetCode#breadth-first-search) * [Depth-First Search]...
- **Symmetric Tree**:判断一个二叉树是否是对称的。 - **Same Tree**:判断两棵二叉树是否相同。 - **Balanced Binary Tree**:判断一个二叉树是否是平衡的。 - **Path Sum**:判断是否存在一条路径,其节点值...
leetcode分发糖果 Leetcode C++ Solution Don't try to understand it, feel ...21-合并两个有序链表:merge-two-sorted-lists 83-删除排序链表中的重复元素:remove-duplicates-from-sorted-...101-对称二叉树:symmetric-
leetcode 答案 LeetCode-Trip ...Symmetric Tree] [104. Maximum Depth of Binary Tree] [121. Best Time to Buy and Sell Stock] [167. Two Sum II - Input array is sorted] Medium [2. Add Two Numbers]
101.symmetric-tree (对称二叉树) 102.binary-tree-level-order-traversal (二叉树的层序遍历) 104.maximum-depth-of-binary-tree (二叉树的最大深度) 105.construct-binary-tree-from-preorder-and-inorder-...
isSymmetric(TreeNode root) { if(root == NULL) return true; return checkSymmetric(root->left, root->right); } bool checkSymmetric(TreeNode* left, TreeNode* right) { if(left == NULL && right == NULL) ...
例如,树的层级遍历(Levelorder Traversal)、判断树的对称性(Symmetric Tree)、找到二叉搜索树中距离某个值最近的节点(Closest Binary Search Tree Value)等。这些题目通常要求编写者熟悉树的结构和遍历方法,...
lru缓存leetcode ...https://leetcode.com/problems/symmetric-tree/ Symmetric Tree 102 https://leetcode.com/problems/binary-tree-level-order-traversal/ Binary Tree Level Order Traversal 103 ...
* Symmetric Tree:给定一个二叉树,判断是否为对称树。这个题目需要使用递归的思想,将树分解成更小的子树,并判断是否对称。 4. 动态规划 动态规划是一种非常重要的算法思想,LeetCode 中有很多关于动态规划的...
在LeetCode精选的TOP面试题中,有两个关于二叉树的问题,分别是验证二叉搜索树(98. Validate Binary Search Tree)和判断对称二叉树(101. Symmetric Tree)。这两个问题都涉及到对二叉树结构的深入理解和遍历策略...
- **对称树(Symmetric Tree)**: 判断一个二叉树是否是对称的。 - **相同的树(Same Tree)**: 判断两个二叉树是否相同。 - **平衡二叉树(Balanced Binary Tree)**: 判断一个二叉树是否是高度平衡的。 ##### 动态规划...
Symmetric tree - Java Recursive - Java Iterative - C Recursive - Python Iterative 0102 Binary Tree Level Order Traversal - Python3 iterative 0103 Binary Tree Zigzag Level Order Traversal - ...
1. 每个文件对应一个LeetCode题目,文件名可能包含了题目的ID或者描述,比如"001-two-sum.js"或"101-symmetric-tree.cpp"。 2. 文件内容通常包括了问题的解法,可能有详细的注释来解释思路和关键步骤。 3. 解决方案...
3. **二叉树**:二叉树问题是算法题目的重头戏,包括"二叉树的遍历"(Traversal)、"判断二叉树对称性"(Symmetric Tree)等。Swift中的可选类型(Optional)使得处理空节点变得直观。 4. **动态规划**:动态规划是...