1、翻转二叉树
递归的方法:交换左子树和右子树,挨个交换,还是要一层一层递归
1.确定递归函数的参数和返回值
int invertTree(TreeNode* root)
2.确定结束条件
if(node==NULL) return root;
3.确定单层递归的逻辑
swap(root->left,root->right);
invertTree(root->left);
invertTree(root->right);
2、对称二叉树
1、思路,递归的方法不是讲两边都输出来然后对比,而是一个结点一个结点的比对,同时左子树的左孩子和右子树的右孩子做比较,左子树的右孩子与右子树的左孩子作比较,为什么要这么操作呢,因为对称的意思是在根节点上立一条对称轴,左右两边对应相等
2、三步走:
1.确定递归函数的参数和返回值
bool compare(TreeNode* left,TreeNode* right)
2.确定结束条件
现在就不是节点为空就停止,而是左空右空、左空右不空、左不空右空、左右不相等结束
// 首先排除空节点的情况
if (left == NULL && right != NULL) return false;
else if (left != NULL && right == NULL) return false;
else if (left == NULL && right == NULL) return true;
// 排除了空节点,再排除数值不相同的情况
else if (left->val != right->val) return false;
3.确定单层递归的逻辑
外层:左子树的左儿子等于右子树的右儿子
内层:左子树的右儿子等于右子树的左儿子
确定:要求上面两个都为真才可以
// 此时就是:左右节点都不为空,且数值相同的情况
// 此时才做递归,做下一层的判断
bool outside = compare(left->left, right->right); // 左子树:左、 右子树:右
bool inside = compare(left->right, right->left); // 左子树:右、 右子树:左
bool isSame = outside && inside; // 左子树:中、 右子树:中 (逻辑处理)
return isSame;
完全对称的逻辑很重要,判断左右值的时候可能会用上;