比较二叉树相等

如何判断两棵二叉树的结构是一样的、且对应的每个结点都有着相同的值。

相等的定义:如何判断两棵二叉树的结构是一样的、对应的每个结点都有着相同的值


有两种方法:一种是递归比较。另一种是二叉树的遍历。
(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 +
                '}';
    }
}


  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值