bool isSymmetric(TreeNode* root) {
if(!root) return true;
return dfs(root->left,root->right);
}
bool dfs(TreeNode* p,TreeNode* q){
if(!p || !q) return !p && !q;
return p->val==q->val && dfs(p->left,q->right) && dfs(p->right,q->left);
}
bool isSymmetric(TreeNode* root) {
if(!root) return true;
stack<TreeNode*> p,q;
auto l = root->left,r = root->right;
while(l || r || p.size() || q.size()){
while(l && r){
p.push(l);
q.push(r);
l=l->left;
r=r->right;
}
if(l || r) return false;
l = p.top(),p.pop();
r = q.top(),q.pop();
if(l->val != r->val) return false;
l = l->right,r = r->left;
}
return true;
}
unordered_map<int,int> pos;
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
int n = preorder.size();
for(int i = 0; i < n; i ++) pos[inorder[i]] = i;
return dfs(preorder,inorder,0,n-1,0,n-1);
}
TreeNode* dfs(vector<int>& preorder,vector<int>& inorder,int pl,int pr,int il,int ir){
if(pl > pr) return NULL;
int val = preorder[pl];
int k = pos[val];
int len = k-il;
auto root = new TreeNode(val);
root->left = dfs(preorder,inorder,pl+1,pl+len,il,k-1);
root->right = dfs(preorder,inorder,pl+len+1,pr,k+1,ir);
return root;
}