思路:
首先需要确定遍历的方式,如果要判断是不是对称二叉树,需要判断对称二叉树的孙子节点是不是对称才可以,意思就是需要我们收集到子节点的信息并且返回给父节点,才可以判断是不是对称二叉树。前序和中序遍历,都不能将子节点的信息返回给父节点,所以这道题只能使用后续遍历的方式来解决了。
//后序遍历 //1.确定参数和返回值 既然要判断是不是对称二叉树返回值 bool 参数为左右节点(如果传入一个头结点的话,既要判断左右儿子的情况,还要判断左右儿子的儿子情况太复杂了) left right //2.确定终止条件 左右节点为空,或者一个为空,或者全为空,或者左右节点的值不一样都结束 //3.确定单层循环的逻辑 左:调用递归函数判断左的左孩子 右的右孩子 右:调用递归函数判断左的右孩子 右的左孩子 中:判断左右的递归的返回值
class Solution { public: bool issame(TreeNode* left, TreeNode* right) { if (left == nullptr && right == nullptr) return true; else if (left == nullptr && right != nullptr) return false; else if (left != nullptr && right == nullptr) return false; else if (left->val != right->val) return false; bool returnA = issame(left->left, right->right);//左 bool returnB = issame(left->right, right->left);//右 return returnA && returnB; //中 } bool isSymmetric(TreeNode* root) { return issame(root->left, root->right); } };