- 题目
给你两棵二叉树的根节点 p 和 q ,编写一个函数来检验这两棵树是否相同。 如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。
- 示例
示例 1: 输入:p = [1,2,3], q = [1,2,3] 输出:true 示例 2: 输入:p = [1,2], q = [1,null,2] 输出:false 示例 3: 输入:p = [1,2,1], q = [1,1,2] 输出:false
- 解题思路
- 方法一:两棵树相同,那么两棵树的前中后序遍历结果都相同。
- 方法二:递归。两棵树相同,那么两棵树的左子树,和右子树都相同。
- 代码(Java)
// 方法一 class Solution { public boolean isSameTree(TreeNode p, TreeNode q) { if (p == null && q == null) { return true; } if ((p == null && q != null) || (p != null && q == null)) { return false; } StringBuilder sbp = new StringBuilder(); StringBuilder sbq = new StringBuilder(); pre(sbp, p); pre(sbq, q); if (!sbp.toString().equals(sbq.toString())) { return false; } sbp = new StringBuilder(); sbq = new StringBuilder(); mid(sbp, p); mid(sbq, q); if (!sbp.toString().equals(sbq.toString())) { return false; } sbp = new StringBuilder(); sbq = new StringBuilder(); back(sbp, p); back(sbq, q); if (!sbp.toString().equals(sbq.toString())) { return false; } return true; } public void pre(StringBuilder sb, TreeNode root) { if (root == null) { sb.append("-"); return; } sb.append(root.val); pre(sb, root.left); pre(sb, root.right); } public void mid(StringBuilder sb, TreeNode root) { if (root == null) { sb.append("-"); return; } mid(sb, root.left); sb.append(root.val); mid(sb, root.right); } public void back(StringBuilder sb, TreeNode root) { if (root == null) { sb.append("-"); return; } mid(sb, root.left); mid(sb, root.right); sb.append(root.val); } }
// 方法二 class Solution { public boolean isSameTree(TreeNode p, TreeNode q) { if (p == null && q == null) { return true; } if ((p == null && q != null) || (p != null && q == null)) { return false; } return q.val == p.val && isSameTree(p.left, q.left) && isSameTree(p.right, q.right); } }