剑指offer系列(58)对称二叉树

题目描述

请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。


思路分析

此题同原  leetcode(101)Symmetric Tree 

整体思路:将对称二叉树的检验转换为与镜像二叉树是否为相等树的问题

递归方法 比较对应左子树与右子树值

循环方法 层序遍历 比较


代码

方法一 递归

boolean isSymmetrical(TreeNode pRoot){
		return isSymmetrical(pRoot, pRoot);
	}
	boolean isSymmetrical(TreeNode pRoot1,TreeNode pRoot2){
		if (pRoot1==null && pRoot2==null) {  //两节点都为空 即相等
			return true;                     //构造递归条件
		}
		if (pRoot1==null || pRoot2==null) {  //一节点为空 另一不为空 返回false
			return false;
		}
		if (pRoot1.val == pRoot2.val) {  //父节点相等 再比较“对称”的子节点值
			return isSymmetrical(pRoot1.left,pRoot2.right) && isSymmetrical(pRoot1.right, pRoot2.left);
		}
		return false;
	}


结果



方法二 循环

boolean isSymmetrical(TreeNode pRoot){
		return isSymmetrical(pRoot, pRoot); //将对称二叉树的检验转换为与镜像二叉树是否为相等树的问题
	}
	boolean isSymmetrical(TreeNode pRoot1,TreeNode pRoot2){
		Queue<TreeNode> queue = new LinkedList<TreeNode>();
		queue.offer(pRoot1); //将两节点入队
		queue.offer(pRoot2);
		while (!queue.isEmpty()) {
			TreeNode temp1 = queue.poll();
			TreeNode temp2 = queue.poll();
			if (temp1==null && temp2==null) {
				continue;   //两节点都为空 即相等
			}
			if (temp1==null || temp2==null || temp1.val!=temp2.val) {
				return false;  //不相等条件
			}
			queue.offer(temp1.left);  //对称条件 左子树的左节点与右子树的右节点比较
			queue.offer(temp2.right);
			queue.offer(temp1.right); //左子树的右节点与右子树的左节点比较
			queue.offer(temp2.left);
		}
		return true;
	}


结果


猜你喜欢

转载自blog.csdn.net/sun10081/article/details/80822978