- 题目描述:
- 设计思想:
同NC15求二叉树的层序遍历那道题目,仍然是使用BFS的思想,每一次都去遍历每一层的节点然后进行比较。详细操作如下:
操作流程如下:
视频讲解链接:B站视频
- 代码:
c++版本:
/** * struct TreeNode { * int val; * struct TreeNode *left; * struct TreeNode *right; * }; */ class Solution { public: /** * * @param root TreeNode类 * @return bool布尔型 */ bool isSymmetric(TreeNode* root) { if(root == NULL) return true;//当根节点为空的时候返回true queue<TreeNode*>q;//定义一个队列,用于存储每一层的节点 q.push(root->left);//把根节点的左孩子放队列 q.push(root->right);//把根节点的右孩子放队列 while(!q.empty()){//队列不为空就执行下面的操作 TreeNode *node1 = q.front();//取出队列的头元素 q.pop();//出队列 TreeNode *node2 = q.front();//取出队列的头元素 q.pop();//出队列 if(node1 == NULL && node2 == NULL) continue;//当前取出的两个节点都为空的时候继续 if(node1 == NULL || node2 == NULL || node1->val != node2->val) return false;//取出的两个节点有一个为空或者值不相等都返回false //通过看图会发现节点的左孩子对应另一个节点的右孩子 //节点的右孩子对应另一个节点的左孩子 q.push(node1->left); q.push(node2->right); q.push(node1->right); q.push(node2->left); } return true; } };
Java版本:
import java.util.*; /* * public class TreeNode { * int val = 0; * TreeNode left = null; * TreeNode right = null; * } */ public class Solution { /** * * @param root TreeNode类 * @return bool布尔型 */ public boolean isSymmetric (TreeNode root) { if(root == null) return true;//当根节点为空的时候返回true Queue<TreeNode> q = new LinkedList<TreeNode>();//定义一个队列,用于存储每一层的节点 q.add(root.left);//把根节点的左孩子放队列 q.add(root.right);//把根节点的右孩子放队列 while(!q.isEmpty()){//队列不为空就执行下面的操作 TreeNode node1 = q.poll();//取出队列的头元素并弹出 TreeNode node2 = q.poll();//取出队列的头元素并弹出 if(node1 == null && node2 == null) continue;//当前取出的两个节点都为空的时候继续 if(node1 == null || node2 == null || node1.val != node2.val) return false;//取出的两个节点有一个为空或者值不相等都返回false //通过看图会发现节点的左孩子对应另一个节点的右孩子 //节点的右孩子对应另一个节点的左孩子 q.add(node1.left); q.add(node2.right); q.add(node1.right); q.add(node2.left); } return true; } }
Python版本:
import queue # class TreeNode: # def __init__(self, x): # self.val = x # self.left = None # self.right = None # # # @param root TreeNode类 # @return bool布尔型 # class Solution: def isSymmetric(self , root ): # write code here if not root: return True#当根节点为空的时候返回true q = queue.Queue()#定义一个队列,用于存储每一层的节点 q.put(root.left)#把根节点的左孩子放队列 q.put(root.right)#把根节点的右孩子放队列 while q.qsize() >0:#队列不为空就执行下面的操作 node1 = q.get()#取出队列的头元素并弹出 node2 = q.get()#取出队列的头元素并弹出 if node1 == None and node2 == None:continue if node1 == None or node2 == None or node1.val != node2.val:return False; #通过看图会发现节点的左孩子对应另一个节点的右孩子 #节点的右孩子对应另一个节点的左孩子 q.put(node1.left); q.put(node2.right); q.put(node1.right); q.put(node2.left); return True