leetcode Symmetric Tree
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
刚开始看这道题,感觉层序遍历可行,当时觉得递归不可行,想了用队列还是双向队列还是vector。= =
后来才发现层序遍历不可行啊,你看第二个例子满足层序遍历的结果是回文(本来想用层序遍历+回文)然而并不是对称树。
后来就觉得用递归,但是递归最重要的就是思想,想了很久不知道该怎么递归。
如果是递归的话,根节点的情况应该是例外的啊。陷入沉思,总之节点都是两两比较,应该构建一个两两比较的函数。于是构建了isReverse函数,判断两个树是不是对称的。
具体的思想说不上来,就是自己画了一个例子,然后想到底要判断哪些节点。
1 /** 2 * Definition for a binary tree node. 3 * struct TreeNode { 4 * int val; 5 * TreeNode *left; 6 * TreeNode *right; 7 * TreeNode(int x) : val(x), left(NULL), right(NULL) {} 8 * }; 9 */ 10 class Solution { 11 public: 12 bool isReverse(TreeNode* p,TreeNode* q){ 13 if(p==NULL||q==NULL){ 14 if(p==NULL&&q==NULL) return true; 15 else return false; 16 } 17 else{ 18 if(p->val==q->val) 19 return isReverse(p->left,q->right)&&isReverse(p->right,q->left); 20 else return false; 21 } 22 } 23 24 bool isSymmetric(TreeNode* root) { 25 if(root==NULL) return true; 26 return isReverse(root->left,root->right); 27 } 28 29 };
补充一点关于堆和栈的知识:
1、stack
stack 模板类的定义在<stack>头文件中。
stack 模板类需要两个模板参数,一个是元素类型,一个容器类型,但只有元素类型是必要
的,在不指定容器类型时,默认的容器类型为deque。
定义stack 对象的示例代码如下:
stack<int> s1;
stack<string> s2;
stack 的基本操作有:
入栈,如例:s.push(x);
出栈,如例:s.pop();注意,出栈操作只是删除栈顶元素,并不返回该元素。
访问栈顶,如例:s.top()
判断栈空,如例:s.empty(),当栈空时,返回true。
访问栈中的元素个数,如例:s.size()。
2、queue
queue 模板类的定义在<queue>头文件中。
与stack 模板类很相似,queue 模板类也需要两个模板参数,一个是元素类型,一个容器类
型,元素类型是必要的,容器类型是可选的,默认为deque 类型。
定义queue 对象的示例代码如下:
queue<int> q1;
queue<double> q2;
queue 的基本操作有:
入队,如例:q.push(x); 将x 接到队列的末端。
出队,如例:q.pop(); 弹出队列的第一个元素,注意,并不会返回被弹出元素的值。
访问队首元素,如例:q.front(),即最早被压入队列的元素。
访问队尾元素,如例:q.back(),即最后被压入队列的元素。
判断队列空,如例:q.empty(),当队列空时,返回true。
访问队列中的元素个数,如例:q.size()