【问题标题】:How to represent a string as binary tree in Java?如何在Java中将字符串表示为二叉树?
【发布时间】:2020-03-12 08:40:02
【问题描述】:

您好,我对编程有点陌生,我必须检查给定的二叉树在 Java 中是否平衡。为此,我想尝试到达双方最深的节点并检查高度差异,但问题是树是这样给出的: AAAxxxAxx 其中 A 是节点,x 是 null 所以这个例子看起来像这样:

       A

    A     A

 A

问题是我不知道如何将字符串表示为二叉树。 我有一个想法并尝试将每个字符添加到 Arraylist 但不久我就放弃了。 抱歉,如果我的问题很愚蠢或其他什么,但我真的不知道该怎么做。 任何提示或帮助将不胜感激,或者如果有人对如何检查树是否平衡有更好的了解,请告诉我。 提前谢谢你。

【问题讨论】:

  • AAAxxxAxx 与你画的树有什么关系?没看懂,能不能在图纸上加个xs?
  • “平衡”有很多不同的定义。你的意思是完美平衡?
  • @Bentaye,我认为字符串是在树的前序遍历中构造的。我将建议进行编辑以添加 xs

标签: java algorithm data-structures binary-tree


【解决方案1】:

在数组中表示二叉树的常用方法是:

  • 如果根位置是i
  • 左孩子是2*i+1
  • 右孩子是2*i+2
  • 对于 N 级树,它需要2^N-1 内存空间。
  • 如果当前节点是i,那么它的父节点是(i-1)/2

例子:

           2
      7        5
    2   6    X    9
   X X 5 11      4  X

数组应该是:{2, 7, 5, 2, 6, -1, 9, -1, -1, 5, 11, -1, -1, 4, -1}

还有其他方法,但这是很常见的。 我希望这能回答你的问题,因为它有点晦涩难懂。

代码请关注this link

【讨论】:

  • 不太对。父级是(i-1)/2。例如,根节点位于位置 0。其子节点位于 (2*i)+1(2*i+2)。所以孩子是 1 和 2。2 的父母是 0,但如果你只使用i/2,你会得到一个父母值 1。
【解决方案2】:

输入字符串似乎呈现了树的前序遍历。

因此,算法通常会使用递归或堆栈将字符串展开为实际的基于节点的树结构。

这是一些代码:

import java.util.*; 

class Node {
    char val;
    Node left = null;
    Node right = null;

    Node(char val) {
        this.val = val;
    }

    static Node fromString(String str) {
        Stack<Node> stack = new Stack<Node>();
        Node node = new Node(' ');
        Node stub = node;
        boolean goRight = false;

        for (int i = 0, n = str.length() ; i < n ; i++) { 
            char c = str.charAt(i); 
            if (c == 'x') {
                if (goRight) {
                    node.right = null;
                    node = stack.pop();
                } else {
                    node.left = null;
                    goRight = true;
                }
            } else {
                Node child = new Node(c);
                if (goRight) {
                    node.right = child;
                    node = node.right;
                    goRight = false;
                } else {
                    node.left = child;
                    stack.push(node);
                    node = node.left;
                }
            }
        }
        return stub.left;
    }
}

你可以这样称呼它:

Node root = Node.fromString("AAAxxxAxx");

这将导致以下对象结构:

{
    "val": 'A',
    "left": {
        "val": 'A',
        "left": { "val": 'A' }
    }, 
    "right": { "val": 'A' }
}


【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-06
    • 2021-11-23
    • 1970-01-01
    • 2021-12-25
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    相关资源
    最近更新 更多