问题描述
给你一个二叉树的根节点 root
, 检查它是否轴对称。
示例 1:
输入:root = [1,2,2,3,4,4,3]
输出:true
示例 2:
输入:root = [1,2,2,null,3,null,3]
输出:false
提示:
- 树中节点数目在范围
[1, 1000]
内
-100 <= Node.val <= 100
进阶:你可以运用递归和迭代两种方法解决这个问题吗?
核心思路
对于二叉树是否对称,要比较的是根节点的左子树与右子树是不是相互翻转的,所以在递归遍历的过程中,要同时遍历这两棵子树,比较两棵子树的里侧和外侧的元素是否相等。
实现要点
本题遍历只能是“后序遍历”,因为我们要通过递归函数的返回值来判断两个子树的内侧节点和外侧节点是否相等。
不过,准确的来说,一棵树的遍历顺序是左右中,另一棵树的遍历顺序是右左中。不是严格上的后序遍历,但可以理解算是后序遍历。
同时,后序也可以理解为是一种回溯。
code
递归
考虑递归三部曲。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| class Solution { public: bool compare(TreeNode* left, TreeNode* right) { 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;
bool outside = compare(left->left, right->right); bool inside = compare(left->right, right->left); bool isSame = outside && inside; return isSame;
} bool isSymmetric(TreeNode* root) { if (root == NULL) return true; return compare(root->left, root->right); } };
|
迭代
在迭代法中我们使用了队列,需要注意的是这里不是层序遍历,而是仅仅通过一个容器来成对的存放我们要比较的元素,用队列,用栈,甚至用数组,都是可以的。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| class Solution { public: TreeNode* invertTree(TreeNode* root) { stack<TreeNode*> st; if (root != NULL) st.push(root); while (!st.empty()) { TreeNode* node = st.top(); if (node != NULL) { st.pop(); if (node->right) st.push(node->right); if (node->left) st.push(node->left); st.push(node); st.push(NULL); } else { st.pop(); node = st.top(); st.pop(); swap(node->left, node->right); } } return root; } };
|