01.05

226.翻转二叉树

思路

1.递归思想,将一个节点左右子节点交换,交换完之后递归其左右子节点。

2.层序遍历(好像二叉树很多题都能用层序遍历)。在层序遍历入队操作时,交换当前出队节点的两个入队左右节点位置。

总结

比较简单

代码

class Solution {
    public TreeNode invertTree(TreeNode root) {
        if (root==null) return root;
        TreeNode temp=new TreeNode();
        temp=root.left;
        root.left=root.right;
        root.right=temp;
        invertTree(root.left);
        invertTree(root.right);
        return root;
    }
}

101.对称二叉树

思路

1.做了翻转二叉树,对称二叉树只需翻转一侧的树,就可以使两颗子树相同。那么只需将其中一颗子树翻转,并比较两个子树是否相同即可。题解代码更为巧妙return dfs(left.left,right.right) && dfs(left.right,right.left);最后一行判断左子树的左节点与右子树的右节点,这样一来就不需要事先翻转了。

2.题解中也讲到了层序遍历来解题,不过须注意的是:队列的两个实现类LinkedList和ArrayDeque

前者可以入队null,后者不可以入队null。因此本题若要使用层序遍历解题,需要使用LinkedList类。这样一来每次出队列取出两个节点值比对,入队是分别从树的两端入队。(或传统层序判断每层List是否构成回文)

代码

递归

	//比较两颗树是否相同
    public static boolean isSameTree(TreeNode p, TreeNode q) {
        if (p == null && q == null) {
            return true;
        }
        if (p == null || q == null) {
            return false;
        }
        if (p.val != q.val) {
            return false;
        }
        //return isSameTree(p.left, q.left) && isSameTree(p.right, q.right);
        return dfs(p.left,q.right) && dfs(p.right,q.left);
    }

    public boolean isSymmetric(TreeNode root) {
        //invertTree(root.right);
        if (isSameTree(root.left,root.right)) return true;
        else return false;
    }

队列(题解)

class Solution {
	public boolean isSymmetric(TreeNode root) {
		if(root==null || (root.left==null && root.right==null)) {
			return true;
		}
		//用队列保存节点
		LinkedList<TreeNode> queue = new LinkedList<TreeNode>();
		//将根节点的左右孩子放到队列中
		queue.add(root.left);
		queue.add(root.right);
		while(queue.size()>0) {
			//从队列中取出两个节点,再比较这两个节点
			TreeNode left = queue.removeFirst();
			TreeNode right = queue.removeFirst();
			//如果两个节点都为空就继续循环,两者有一个为空就返回false
			if(left==null && right==null) {
				continue;
			}
			if(left==null || right==null) {
				return false;
			}
			if(left.val!=right.val) {
				return false;
			}
			//将左节点的左孩子, 右节点的右孩子放入队列
			queue.add(left.left);
			queue.add(right.right);
			//将左节点的右孩子,右节点的左孩子放入队列
			queue.add(left.right);
			queue.add(right.left);
		}
		
		return true;
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值