如何判断两棵二叉树的结构是一样的、且对应的每个结点都有着相同的值。
相等的定义:如何判断两棵二叉树的结构是一样的、对应的每个结点都有着相同的值
有两种方法:一种是递归比较。另一种是二叉树的遍历。
(1)方法一:前序(后序) +中序可以唯一确定一颗二叉树
先说二叉树的遍历。由于先序遍历 再加上 中序遍历能唯一确定一棵二叉树。故,对这两棵树分别进行先序和中序遍历,比较这两棵树的先序遍历序列和中序遍历序列,如果都一样则说明这两棵二叉树是一样的。这里用了两次遍历。时间复杂度为O(2n)
由于二叉树的中序遍历和先序/后序遍历比较容易,故不用代码实现了。
(2)使用同层次递归比较的方式
下面来看如何用递归来判断两棵二叉树是不是一样的。
时间复杂度是O(n),只用一次完整的同时遍历两棵树即可!!
package suanfa;
/**
* @description:判断两个二叉树是否相等
* @author: fangchangtan
* @create: 2019-01-24 16:16
*/
public class IsSubTreeSolution {
public static void main(String[] args) {
TreeNode treeNode1 = buildTree();//树1
TreeNode treeNode2 = buildTree();//树2
boolean sameTree = isSameTree(treeNode1, treeNode2);
System.out.println(sameTree);
}
/**
* 比较二叉树相等(结构完全相等):true|false
* 使用递归遍历左右子树
* @param root1
* @param root2
* @return
*/
public static boolean isSameTree(TreeNode root1,TreeNode root2) {
//树的结果不相同,返回false
if (root1 != null && root2 == null) { return false; }
if (root1 == null && root2 != null) { return false; }
//两棵树最终递归到终点时
if (root1 == null && root2 == null) { return true; }
if (root1.data != root2.data) {return false; }
return isSameTree(root1.left,root2.left) && isSameTree(root1.right,root2.right);
}
/**
* 构建二叉树
*
* @return
*/
private static TreeNode buildTree() {
TreeNode node1 = new TreeNode(1, null, null);
TreeNode node2 = new TreeNode(2, null, null);
TreeNode node3 = new TreeNode(3, null, null);
TreeNode node4 = new TreeNode(4, null, null);
node1.left = node2;
node1.right = node3;
node2.left = node4;
return node1;
}
/**
* 构建二叉树
*
* @return
*/
private static TreeNode buildTree2() {
TreeNode node1 = new TreeNode(1, null, null);
TreeNode node2 = new TreeNode(2, null, null);
TreeNode node3 = new TreeNode(3, null, null);
TreeNode node4 = new TreeNode(4, null, null);
node1.left = node2;
node1.right = node3;
node3.left = node4;
return node1;
}
}
/**
* 定义二叉树节点
*/
class TreeNode{
int data;
TreeNode left;
TreeNode right;
public TreeNode(int data, TreeNode left, TreeNode right) {
this.data = data;
this.left = left;
this.right = right;
}
@Override
public String toString() {
return "TreeNode{" +
"data=" + data +
'}';
}
}