对称二叉树
给你一个二叉树的根节点 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
进阶:你可以运用递归和迭代两种方法解决这个问题吗?
作者:力扣 (LeetCode)
链接:https://leetcode-cn.com/leetbook/read/top-interview-questions-easy/xn7ihv/
首先这道题我第一个想法是,是否可以中序遍历,然后双指针问题解决它。
当树是满二叉树时,这样的方法是可行的,但如果如实例2中的树,中序遍历就不可行了。
那就递归咯。首先他要是对称的。以三层为例。也就是我们第二层的左右节点,左节点的右孩子节点的值要等于右节点的左孩子的值,左孩子的左节点的值要等于右节点右孩子的值。
递归出口是,如果左右节点为空return true
如果左右节点不等直接return false
最后一个就是左右相等且左节点的右孩子等于右节点的左孩子,左节点的左孩子等于右节点的右孩子。
class Solution {
public:
bool isSymmetric(TreeNode* root) {
return digui(root,root);
}
bool digui(TreeNode* left,TreeNode* right){
if(!left && !right){
return true;
}
if(!left || !right){
return false;
}
return right->val == left->val && digui(left->right,right->left)&& digui(left->left,right->right);
}
};
第二种方法是使用迭代的方法将他放入一个队列。这里引用一下他人的代码。
扫描他的左子树和右子树。
class Solution {
public:
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;
}
// 左右一个节点不为空,或者都不为空但数值不相同,返回false
if ((!leftNode || !rightNode || (leftNode->val != rightNode->val))) {
return false;
}
que.push(leftNode->left); // 加入左节点左孩子
que.push(rightNode->right); // 加入右节点右孩子
que.push(leftNode->right); // 加入左节点右孩子
que.push(rightNode->left); // 加入右节点左孩子
}
return true;
}
};
作者:carlsun-2
链接:https://leetcode-cn.com/problems/symmetric-tree/solution/dai-ma-sui-xiang-lu-dai-ni-xue-tou-er-ch-hnjo/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。