翻转二叉树
// 确认返回值和参数
TreeNode* invertTree(TreeNode* root) {
// 确认终止条件
if(root == NULL) return root;
swap(root->left,root->right);
invertTree(root->left);
invertTree(root->right);
return root;
}
总的来通过二叉树循环三步骤就可以完成基于遍历二叉树之上的多个操作
对称二叉树
// 递归法
// 二叉树遍历三部曲
// 1. 明确返回值类型即参数
bool Compare(TreeNode* left,TreeNode*right){
// 2. 明确终止条件
if(left != NULL && right == NULL) return false;
if(left == NULL && right != NULL) return false;
if(left == NULL && right == NULL) return true;
if(left->val != right->val) return false;
bool outside = Compare(left->left,right->right);
bool insiede = Compare(left->right,right->left);
bool isSame = outside && insiede;
return isSame;
}
bool isSymmetric(TreeNode* root) {
if(root == NULL) return true;
else return Compare(root->left,root->right);
}
// 迭代法
bool isSymmetric(TreeNode* root) {
if (root == NULL) return true;
queue<TreeNode*> que;
que.push(root->left); // 将左子树头结点加入队列
que.push(root->right); // 将右子树头结点加入队列
while(!que.empty()){
TreeNode* leftNode = que.front(); que.pop();
TreeNode* rightNode = que.front(); que.pop();
if (!leftNode && !rightNode) { // 左节点为空、右节点为空,此时说明是对称的
continue;
}
// 左右有一个不为空或左右值不相等
if(!leftNode || !rightNode || leftNode->val != rightNode->val) retrun false;
// 剩下的可能是左右两值相同
que.push(leftNode->left);
que.push(leftNode->right);
que.push(rightNode->left);
que.push(rightNode->right);
}
}