「这是我参与2022首次更文挑战的第33天,活动详情查看:2022首次更文挑战」。
题目:给定二叉树的根节点,判断此二叉树是否轴对称。
解题思路(递归)
一棵树为对称二叉树的条件是这棵树的左子树和右子树对称,那么如何判断左子树和右子树对称呢?
左子树和右子树对称的判断条件为左子树的右子树和右子树的左子树是对称的,而左子树的左子树和右子树的右子树是对称的。在这两条路径上的节点的值是对应相等的。
我们可以通过递归来对节点进行判断,输入为左子树的根节点和右子树的根节点,首先判断左子树的根节点是否同时为空,如果同时为空则满足条件,不同时为空则返回false。之后判断左子树和右子树的对应值是否相等即可。递归此过程,可得如下代码:
public boolean isSymmetric(TreeNode root) {
return checkSymmetric(root, root);
}
public boolean checkSymmetric(TreeNode node, TreeNode node2){
if(node==null&&node2==null) return true;
if(node==null||node2==null) return false;
if(node.val!=node2.val) return false;
return checkSymmetric(node.left, node2.right)&&checkSymmetric(node.right, node2.left);
}
上述方法的时间复杂度和空间复杂度都是。
非递归
非递归方式实际上是人工进行压栈操作,我们可以新建一个栈,初始时候将根节点进行两次入栈,分别代表左子树根节点和右子树根节点,之后根据栈中元素,每次出栈两个节点,判断和上面递归判断是一样的,包括判断是否同时为空以及判断元素是否相等,之后将弹出节点的左子树的左子树和右子树的右子树入栈以及左子树的右子树和右子树的左子树入栈,必须对应入栈,这样弹出才能对应,代码如下:
public boolean checkSymmetric(TreeNode left, TreeNode right){
Stack<TreeNode> stack = new Stack<>();
stack.push(left);
stack.push(right);
while (!stack.isEmpty()){
right = stack.pop();
left = stack.pop();
if(left==null&&right==null) continue;
if(left==null||right==null||(left.val!=right.val)) return false;
stack.push(left.left);
stack.push(right.right);
stack.push(left.right);
stack.push(right.left);
}
return true;
}
上述代码的时间复杂度和空间复杂度都为。