1、反转二叉树,题目较简单,递归最简单,迭代法前后序也还xing,主要是中序遍历,中序的话是左右中,先翻转左,再翻转中,这样原来的左就变成右,再翻转右的话相当于对最开始的左做了两次翻转,所以应该翻转左。
递归:
class Solution {
public:
void inverseTree(TreeNode* node)
{
if(node == nullptr) return;
swap(node->right,node->left);
inverseTree(node->left);
inverseTree(node->right);
}
TreeNode* invertTree(TreeNode* root) {
inverseTree(root);
return root;
}
};
前序迭代::
class Solution {
public:
TreeNode* invertTree(TreeNode* root) {
stack<TreeNode*> st;
if(root==nullptr) return root;
st.push(root);
while(!st.empty())
{
TreeNode* tmp = st.top();
st.pop();
swap(tmp->left,tmp->right);
if(tmp->left) st.push(tmp->left);
if(tmp->right) st.push(tmp->right);
}
return root;
}
};
2、对称二叉树主要是涉及比较,内侧和外侧,理解这一点就好了
递归:
class Solution {
public:
bool symmetric(TreeNode* left, TreeNode* right) {
if (left != nullptr && right == nullptr)
return false;
else if (right != nullptr && left == nullptr)
return false;
else if (right == nullptr && left == nullptr)
return true;
else if (left->val != right->val)
return false;
bool bool1 = symmetric(left->left, right->right);
bool bool2 = symmetric(left->right, right->left);
return bool1 && bool2;
}
bool isSymmetric(TreeNode* root) {
if (root == nullptr)
return true;
return symmetric(root->left, root->right);
}
};
迭代:
class Solution {
public:
bool isSymmetric(TreeNode* root) {
queue<TreeNode*> q;
if(root==nullptr) return root;
q.push(root->left);
q.push(root->right);
while(!q.empty())
{
TreeNode* left = q.front();
q.pop();
TreeNode* right = q.front();
q.pop();
if(left == nullptr && right != nullptr) return false;
if(left != nullptr && right == nullptr) return false;
if(left == nullptr && right == nullptr) continue;
if(left->val != right->val) return false;
q.push(left->left);
q.push(right->right);
q.push(left->right);
q.push(right->left);
}
return true;
}
};