当前位置: 首页 > 知识库问答 >
问题:

等效排序二叉树Java

井高峯
2023-03-14

我正在学习Go,在本教程中,可以使用并发和通道来完成这个练习:解决方案。

我试图通过Java解决这个问题。我能想到的解决方案是使用临时数据结构来存储顺序遍历这两棵树的结果,然后进行比较。

例如,我使用StringBuilder存储顺序遍历的结果,然后进行比较(注意,我们正在比较排序的二叉树):

    public boolean equivalentBST(TreeNode p, TreeNode q) {
        StringBuilder pSb = new StringBuilder();
        walk(pSb, p);
        StringBuilder qSb = new StringBuilder();
        walk(qSb, q);
        return pSb.compareTo(qSb) == 0;
    }

    private void walk(StringBuilder sb, TreeNode node) {
        if (node == null) {
            return;
        }
        walk(sb, node.left);
        sb.append(node.val);
        walk(sb, node.right);
    }

测试用例:

        TreeNode p = new TreeNode(9);
        TreeNode p2 = new TreeNode(8);
        TreeNode p3 = new TreeNode(7);
        p.left = p2;
        p2.left = p3;

        TreeNode q = new TreeNode(9);
        TreeNode q2 = new TreeNode(8);
        TreeNode q3 = new TreeNode(7);
        q3.right = q2;
        q.left = q3;

        System.out.println(equivalentBST(q, p)); // output true

我想知道有没有其他更好的方法通过Java解决这个问题?

共有1个答案

伊羽
2023-03-14

您可以同时遍历这两棵树并立即比较它们的元素,而无需使用StringBuilder

大致意思是:

public boolean equivalentBST(TreeNode node1, TreeNode node2) {
    var stack1 = new ArrayList<TreeNode>();
    var stack2 = new ArrayList<TreeNode>();

    while (true) {
        while (node1 != null) {
            stack1.add(node1);
            node1 = node1.left;
        }
        while (node2 != null) {
            stack2.add(node2);
            node2 = node2.left;
        }
        if (stack1.isEmpty() || stack2.isEmpty())
            return stack1.isEmpty() && stack2.isEmpty();
        node1 = stack1.remove(stack1.size() - 1);
        node2 = stack2.remove(stack2.size() - 1);
        if (node1.val != node2.val)
            return false;
        node1 = node1.right;
        node2 = node2.right;
    }
}
 类似资料:
  • 主要内容:什么是二叉排序树?,使用二叉排序树查找关键字,二叉排序树中插入关键字,二叉排序树中删除关键字,总结前几节介绍的都是有关静态 查找表的相关知识,从本节开始介绍另外一种查找表—— 动态查找表。 动态查找表中做查找操作时,若查找成功可以对其进行删除;如果查找失败,即表中无该关键字,可以将该关键字插入到表中。 动态查找表的表示方式有多种,本节介绍一种使用树结构表示动态查找表的实现方法—— 二叉排序树(又称为 “二叉查找树”)。 什么是二叉排序树? 二叉排序树要么是空 二叉树,要么具有如下特点:

  • HLOJ 9576,习题7-2 二叉排序树 输入一个整数关键字序列,生成一棵用链式存储结构存储的二叉排序树,对该二叉排序树能进行查找和插入结点的操作,并对该二叉排序树中结点的关键字按递增和递减顺序输出。 要求依次完成以下工作: (1) 以这n个整数生成(建立)一棵用链式存储结构存储的二叉排序树; (2) 按递增顺序输出该二叉排序树中的整数(关键字); (3) 输入一个整数key1,对该二叉排序树进

  • 问题内容: 我正在尝试解决等效的二叉树演习。这是我所做的; 但是,我无法找出如何发信号通知树中是否还剩下任何元素。我无法使用on,因为它会使通道在所有值发送之前关闭(因为递归。)有人可以在这里帮我吗? 问题答案: 如果Walk函数本身不递归,则可以使用close()。即步行将做: 其中walkRecurse或多或少是您当前的Walk功能,但是在walkRecurse上递归。(或者您将Walk重写为

  • 判断是否二叉排序树 根据带虚结点的先序序列建立二叉树,然后判断其是否为二叉排序树。 输入格式: 测试数据有多组,处理到文件尾。每组测试数据在一行中输入一个数字字符串(不含’0’且长度不超过20),表示二叉树的先序遍历序列,其中字符*表示虚结点(对应的子树为空)。 输出格式: 对于每组测试,输出是否二叉排序树的判定结果,是输出“YES”,否则输出“NO”。引号不必输出。 输入样例: 5687* 54

  • 我正在解围棋中的练习,等价的二叉树。此练习需要实现一个函数,该函数将遍历一棵树,并将所有值有序地从树发送到通道。 演习声明指出: ...我们将使用Go的并发和通道编写一个简单的解决方案。 阅读这一行,我认为实现是一个挑战,它为每个左/右子树启动一个goroutine,并使比非并发版本运行得更快(关于时间复杂度)。让我用代码更详细地解释一下。 这是我早期的行走代码: 它当然使用goroutines,

  • 对哈斯克尔来说真的很新鲜,我想不通。如何检查给定二叉树中的是否大于其子节点? 函数< code>descendingTree将获得一个< code>IntTree并将返回给我一个Boolean值,表明对于树中的每个节点,该节点的值是否大于其两个子节点的值;如果它有孩子的话。这个函数怎么写?