相同的二叉树

给你两棵二叉树的根节点 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

解题思路:

先判断两棵树当前节点是否都为空,是则返回true;若只有一棵为空则返回false。接着对比当前节点值,不等则返回false。若当前节点都存在且值相等,就递归比较它们的左子树和右子树,左右子树都相同才返回true,有一边不同就返回false。先处理输入为空的边界情况,返回空树。然后从输入首元素创建根节点并入队列,按层序遍历顺序,依输入内容为节点构建左、右子树(非 “#” 表示有节点,创建并关联后入队列),最终返回根节点。

具体代码:

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Scanner;

// 定义二叉树节点类
class TreeNode1 {
    int val;
    TreeNode left;
    TreeNode right;

    TreeNode1(int val) {
        this.val = val;
        this.left = null;
        this.right = null;
    }
}

class Solution3 {
    public boolean isSameTree(TreeNode p, TreeNode q) {
        // 如果两棵树当前节点都为空,说明同步遍历到了叶子节点的下一层,认为相同
        if (p == null && q == null) {
            return true;
        }
        // 如果其中一棵为空,另一棵不为空,结构不同,返回False
        if (p == null || q == null) {
            return false;
        }
        // 如果当前节点的值不相等,返回False
        if (p.val!= q.val) {
            return false;
        }
        // 递归比较左子树和右子树是否相同
        return isSameTree(p.left, q.left) && isSameTree(p.right, q.right);
    }
}

public class  xiangTongDeShu{
    public static TreeNode buildTree(String[] input) {
        if (input == null || input.length == 0) {
            return null;
        }
        // 使用队列辅助构建二叉树
        LinkedList<TreeNode> queue = new LinkedList<>();
        TreeNode root = new TreeNode(Integer.parseInt(input[0]));
        queue.add(root);
        int index = 1;
        while (!queue.isEmpty() && index < input.length) {
            TreeNode current = queue.poll();
            // 构建左子树
            if (!input[index].equals("#")) {
                TreeNode left = new TreeNode(Integer.parseInt(input[index]));
                current.left = left;
                queue.add(left);
            }
            index++;
            // 构建右子树
            if (index < input.length &&!input[index].equals("#")) {
                TreeNode right = new TreeNode(Integer.parseInt(input[index]));
                current.right = right;
                queue.add(right);
            }
            index++;
        }
        return root;
    }

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        System.out.println("请按照层序遍历顺序输入第一棵二叉树节点值(用空格隔开,空节点用#表示):");
        String inputStr1 = scanner.nextLine();
        String[] inputArray1 = inputStr1.split(" ");
        TreeNode tree1 = buildTree(inputArray1);

        System.out.println("请按照层序遍历顺序输入第二棵二叉树节点值(用空格隔开,空节点用#表示):");
        String inputStr2 = scanner.nextLine();
        String[] inputArray2 = inputStr2.split(" ");
        TreeNode tree2 = buildTree(inputArray2);

        Solution3 solution3 = new Solution3();
        boolean result = solution3.isSameTree(tree1, tree2);
        System.out.println("两棵树是否相同:" + result);

        scanner.close();
    }
}

运行截图:

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值