递归之镜像二叉树

关于树的题目使用递归解决是最方便的。

题目:给定一棵二叉树,判断琪是否是自身的镜像(即:是否对称)
题目来源

初始思路

最直观的解法就是比较对称位置上的结点值是否相同。我们知道二叉树的遍历有前序、后序、中序三种最常用的方法。我们可以在迭代遍历二叉树的同时进行数值的比较。只要有一个不等就可以确定不相似。

第一个问题就是对称点的对应问题,我们必须保持根节点的两个子树的遍历顺序是镜像的,即左子树:根、左、右;右子树:根、右、左。

我们可以使用前序遍历遍历左子树,使用对称的前序遍历遍历右子树。

改进思路

我们每次迭代都遍历左子树或者右子树的一个顶点,这样在比较之前必须持久化之前遍历的内容,比较麻烦。所以尝试同时遍历左右子树,递归的形参设置为左右子树的对称位置结点,当结点只有一个为空或者值不等的时候,返回false。 这样极大的简化了代码量,思路也更加清晰。

代码

public class Solution{
	public boolean isSymmetric(TreeNode root){
		return solve(root,root);
	}

	public boolean solve(TreeNode node1, TreeNode node2){
		if(node1 == null && node2 == null)return true;
		//此处必然有一个结点不为空,此时node1或者node2中有一个为空返回false
		if(node1 == null || node2 == null)return false;

		return (node1.val == node2.val) && solve(node1.left,node2.right) && solve(node1.right,node2.left);
}

温故知新,未央书斋

你可能感兴趣的:(计算机,刷题笔记,二叉树,数据结构,java,leetcode)