101. Symmetric Tree
来源:互联网 发布:保定seo胜达 编辑:程序博客网 时间:2024/05/16 17:25
正常思路:逐层查找,返回每一层结果,然后判断每一层是否对称。但是在一个例子上内存超了,头疼。只要问题在于每一层由于存储null,使得每一层的数据都是2的幂次方,层数越多,内存容易增长的过快,使得内存不足。
因此打算不再存储null,而是存储每一个数据在一层的位置。然后比较,尽量减少内存的消耗。
/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solution {public: bool layerSym(vector<TreeNode*> layer) { int left=0; int right=layer.size()-1; while(left<right) { if(layer[left]==NULL&&layer[right]==NULL) { left++; right--; } else if(layer[left]!=NULL&&layer[right]!=NULL&&(layer[left]->val==layer[right]->val)) { left++; right--; } else break; } if(left<right) return false; else return true; } bool isSymmetric(TreeNode* root) { vector<vector<TreeNode*>> result; vector<int> state(1000,0); if(root==NULL) return true; queue<TreeNode*> layer; queue<int> depth; layer.push(root); depth.push(1); state[0]=1; while(state[depth.front()-1]!=0&&!layer.empty()) { if(layer.front()==NULL) { layer.push(NULL); depth.push(depth.front()+1); layer.push(NULL); depth.push(depth.front()+1); } else { layer.push(layer.front()->left); depth.push(depth.front()+1); layer.push(layer.front()->right); depth.push(depth.front()+1); } if(result.size()<depth.front()) { vector<TreeNode*> temp; temp.push_back(layer.front()); result.push_back(temp); } else { result[depth.front()-1].push_back(layer.front()); } if(layer.front()!=NULL) state[depth.front()]=1; layer.pop(); depth.pop(); } for(int i=0;i<result.size();i++) { if(!layerSym(result[i])) return false; } return true; }};
成功AC的代码,建立了三个queue进行操作,成功率低不是没有道理的。哭。。。
/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solution {public: bool layerSym(vector<int> num,vector<int> pos, int depth) { if(depth==0&&num.size()==1) return true; else { if(num.size()%2!=0) return false; int left=0; int right=num.size()-1; while(left<right) { if((pos[left]+pos[right]-1==pow(2,depth))&&(num[left]==num[right])) { left++; right--; } else return false; } return true; } } bool isSymmetric(TreeNode* root) { vector<vector<int>> numResult; vector<vector<int>> posResult; if(root==NULL) return true; queue<TreeNode*> layer; queue<int> depth; queue<int> pos; layer.push(root); depth.push(1); pos.push(1); while(!layer.empty()) { if(layer.front()->left!=NULL) { layer.push(layer.front()->left); depth.push(depth.front()+1); pos.push(pos.front()*2-1); } if(layer.front()->right!=NULL) { layer.push(layer.front()->right); depth.push(depth.front()+1); pos.push(pos.front()*2); } if(numResult.size()<depth.front()) { vector<int> temp; temp.push_back(layer.front()->val); numResult.push_back(temp); vector<int> posTemp; posTemp.push_back(pos.front()); posResult.push_back(posTemp); } else { numResult[depth.front()-1].push_back(layer.front()->val); posResult[depth.front()-1].push_back(pos.front()); } layer.pop(); depth.pop(); pos.pop(); } //vector<vector<int>> numResult; //vector<vector<int>> posResult; /* for(int i=0;i<numResult.size();i++) { cout<<"depth "<<i+1<<endl<<endl; for(int j=0;j<numResult[i].size();j++) cout<<numResult[i][j]<<" "<<posResult[i][j]<<endl; } */ for(int i=0;i<numResult.size();i++) { if(!layerSym(numResult[i],posResult[i],i)) return false; } return true; }};
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
- linux网络编程之IP协议首部格式与其配套使用的四个协议(ARP,RARP,ICMP,IGMP)和TCP、UDP协议头结构总结
- B1039. 到底买不买(20)
- pycharm 2017激活码
- 用matlab在图片上画出网格
- Angular2组件与指令的小实践——实现一个图片轮播组件
- 101. Symmetric Tree
- java之集合框架!!!
- 详细深入分析 Java ClassLoader 工作机制
- JSP分页显示
- 装饰者模式
- 初学C&C++,大神多多指导。初学数组。
- 认识注册表-2
- JAVA因式分解算法
- JSON用法总结