101. Symmetric Tree
来源:互联网 发布:编程电脑配置要求2017 编辑:程序博客网 时间:2024/05/29 23:45
Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center).
For example, this binary tree is symmetric:
1 / \ 2 2 / \ / \3 4 4 3
But the following is not:
1 / \ 2 2 \ \ 3 3
Note:
Bonus points if you could solve it both recursively and iteratively.
算法1:递归解法,判断左右两颗子树是否对称,只要两颗子树的根节点值相同,并且左边子树的左子树和右边子树饿右子树对称 且 左边子树的右子树和右边子树的左子树对称
/** * Definition for binary tree * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solution {public: bool isSymmetric(TreeNode *root) { // IMPORTANT: Please reset any member data you declared, as // the same Solution instance will be reused for each test case. if(root == NULL)return true; return isSymmetricRecur(root->left, root->right); } bool isSymmetricRecur(TreeNode *root1, TreeNode *root2) { if(root1 != NULL && root2 != NULL) { if(root1->val == root2->val && isSymmetricRecur(root1->left, root2->right) && isSymmetricRecur(root1->right, root2->left)) return true; else return false; } else if(root1 != NULL || root2 != NULL) return false; else return true; }};算法2:非递归解法,用两个队列分别保存左子树节点和右子树节点,每次从两个队列中分别取出元素,如果两个元素的值相等,则继续把他们的左右节点加入左右队列。要注意每次取出的两个元素,左队列元素的左孩子要和右队列元素的右孩子要同时不为空或者同时为空,否则不可能对称,同理左队列元素的右孩子要和右队列元素的左孩子也一样。
/** * Definition for binary tree * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solution {public: bool isSymmetric(TreeNode *root) { // IMPORTANT: Please reset any member data you declared, as // the same Solution instance will be reused for each test case. if(root == NULL)return true; queue<TreeNode*> qleft, qright; if(root->left)qleft.push(root->left); if(root->right)qright.push(root->right); while(qleft.empty() == false && qright.empty() == false) { TreeNode *ql = qleft.front(); TreeNode *qr = qright.front(); qleft.pop(); qright.pop(); if(ql->val == qr->val) { if(ql->left && qr->right) { qleft.push(ql->left); qright.push(qr->right); } else if(ql->left || qr->right) return false; if(qr->left && ql->right) { qleft.push(qr->left); qright.push(ql->right); } else if(qr->left || ql->right) return false; } else return false; } if(qleft.empty() && qright.empty()) return true; else return false; }};
0 0
- LeetCode 101. Symmetric Tree
- [LeetCode]101.Symmetric Tree
- 【LeetCode】101.Symmetric Tree
- [Leetcode] 101. Symmetric Tree
- LeetCode --- 101. Symmetric Tree
- [leetcode] 101.Symmetric Tree
- 101.Symmetric Tree
- 101. Symmetric Tree
- LeetCode : 101. Symmetric Tree
- [leetcode]101.Symmetric Tree
- Leetcode 101. Symmetric Tree
- 101. Symmetric Tree
- 101. Symmetric Tree
- 101. Symmetric Tree LeetCode
- 101. Symmetric Tree
- 101. Symmetric Tree
- 101. Symmetric Tree
- [LeetCode]101. Symmetric Tree
- Java字符串切割
- HDU 1257.最少拦截系统【8月9】
- poj2492 A Bug's Life 并查集
- DP - hdu5291 Candy Distribution
- python爬虫抓取LeetCode题目
- 101. Symmetric Tree
- 装wampserver时显示计算机丢失MSVCR110.dll
- hdu 1142(最短路dijkstra)
- 【Qt OpenGL教程】21:线、反走样、正投影和简单的声音
- C++:复制构造函数___浅拷贝
- UVA - 1442 Cav
- Leetcode# 110 Balanced Binary Tree
- 黑马程序员 oc随记 写一个手动内存释放
- 静态字符串模式匹配模板库