算法学习12(题解)
声明:本文为转载文章,仅用来学习交流,详情见文末
1.题目
给你一个二叉树的根节点root
, 检查它是否轴对称。
2.实例
实例一
输入:root = [1,2,2,3,4,4,3]
输出:true
实列二
输入:root = [1,2,2,null,3,null,3]
输出:false
3.思路
递归解决
判断二叉树是否是对称,需要从子节点开始比较,两个子节点的值必须相同,并且左子节点的右子节点(如果有)必须等于右子节点的左子节点,左子节点的左子节点必须等于右子节点的右子节点,所以需要二叉树左右两部分通过中序遍历进行比较。
public boolean isSymmetric(TreeNode root) {
if (root == null)
return true;
//从两个子节点开始判断
return isSymmetricHelper(root.left, root.right);
}
public boolean isSymmetricHelper(TreeNode left, TreeNode right) {
//如果左右子节点都为空,说明当前节点是叶子节点,返回true
if (left == null && right == null)
return true;
//如果当前节点只有一个子节点或者有两个子节点,但两个子节点的值不相同,直接返回false
if (left == null || right == null || left.val != right.val)
return false;
//然后左子节点的左子节点和右子节点的右子节点比较,左子节点的右子节点和右子节点的左子节点比较
return isSymmetricHelper(left.left, right.right) && isSymmetricHelper(left.right, right.left);
}
从根节点的左右节点同时开始遍历并对节点进行判断,从最外层到达树的底端,也就是当节点左右子节点都为null
时到达叶节点,然后开始从后往前递归进行中序遍历。
该解法在入栈和出栈时都对数据进行了逻辑处理,所以不属于任何一种遍历方式, 入栈时相当于前序遍历,出栈是中序遍历。
以上题目及实列均来自于:力扣(LeetCode)
代码摘录至作者:数据结构和算法