AVL树中序遍历不起作用

发布于 2024-12-27 03:27:06 字数 757 浏览 3 评论 0原文

我的 AVL 树是在 Java 中使用二维整数数组 avlTree[35][5] 实现的 - 列表示:

  • [0] - 左高度
  • [1] - 左孩子
  • [2] -数据
  • [3] - 右孩子
  • [4] - 右身高。

我从主程序调用以下方法,结果我得到三个节点:最左边的节点两次,然后是其父节点。

public void inorderTraversal(int root) {
    if ((Main.avlTree[root][1] == 0) && (Main.avlTree[root][3] == 0)) {
        System.out.println(Main.avlTree[root][2]);
    } else {
        if (Main.avlTree[root][1] != 0) {
            root = Main.avlTree[root][1];
            inorderTraversal(root);
        }
        System.out.println(Main.avlTree[root][2]);

        if (Main.avlTree[root][3] != 0) {
            root = Main.avlTree[root][3];
            inorderTraversal(root);
        }
    }
}

My AVL tree is implemented in Java using a two-dimensional array of integers avlTree[35][5] - The columns represent:

  • [0] - Height Left
  • [1] - Left Child
  • [2] - Data
  • [3] - Right Child
  • [4] - Height Right.

I am calling the following method from the main program, and as a result I get three nodes: the leftmost node twice followed by its parent.

public void inorderTraversal(int root) {
    if ((Main.avlTree[root][1] == 0) && (Main.avlTree[root][3] == 0)) {
        System.out.println(Main.avlTree[root][2]);
    } else {
        if (Main.avlTree[root][1] != 0) {
            root = Main.avlTree[root][1];
            inorderTraversal(root);
        }
        System.out.println(Main.avlTree[root][2]);

        if (Main.avlTree[root][3] != 0) {
            root = Main.avlTree[root][3];
            inorderTraversal(root);
        }
    }
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

-柠檬树下少年和吉他 2025-01-03 03:27:06

我写了这个测试程序:

public class AVLTree {

    /*
        [0] - Height Left
        [1] - Left Child
        [2] - Data
        [3] - Right Child
        [4] - Height Right.
    */
    private static int[][] avlTree;

    public static void main(String[] args) {
        avlTree = new int[4][5];

        // root (L: 1; R: 3)
        avlTree[0][0] = 0;
        avlTree[0][1] = 1;
        avlTree[0][2] = 3005;
        avlTree[0][3] = 2;
        avlTree[0][4] = 1;

        // parent: root (L: -1; R: -1)
        avlTree[1][0] = 0;
        avlTree[1][1] = -1;
        avlTree[1][2] = 73375;
        avlTree[1][3] = -1;
        avlTree[1][4] = 0;

        // parent: root (L: 3; R: -1)
        avlTree[2][0] = 0;
        avlTree[2][1] = 3;
        avlTree[2][2] = 831954;
        avlTree[2][3] = -1;
        avlTree[2][4] = 0;

        // parent: 2 (L: -1; R: -1)
        avlTree[3][0] = 0;
        avlTree[3][1] = -1;
        avlTree[3][2] = 7485;
        avlTree[3][3] = -1;
        avlTree[3][4] = 0;

        inOrder(0);
    }

    private static void inOrder(int root) {
        if(root == -1) {
            // nothing to do
            return ;
        }

        // call function with left child
        inOrder( avlTree[root][1] );

        // print root
        System.out.println( avlTree[root][2]);

        // call function with right child
        inOrder( avlTree[root][3]);
    }
}

输出符合预期:

73375
3005
7485
831954

我对你的代码也没有问题;在我的测试中效果很好。也许你的树是假的?如果没有,我还建议使用 -1 作为右/左孩子;否则会有点误导,因为 0 可能意味着位置 0 处的节点。

I wrote this test program:

public class AVLTree {

    /*
        [0] - Height Left
        [1] - Left Child
        [2] - Data
        [3] - Right Child
        [4] - Height Right.
    */
    private static int[][] avlTree;

    public static void main(String[] args) {
        avlTree = new int[4][5];

        // root (L: 1; R: 3)
        avlTree[0][0] = 0;
        avlTree[0][1] = 1;
        avlTree[0][2] = 3005;
        avlTree[0][3] = 2;
        avlTree[0][4] = 1;

        // parent: root (L: -1; R: -1)
        avlTree[1][0] = 0;
        avlTree[1][1] = -1;
        avlTree[1][2] = 73375;
        avlTree[1][3] = -1;
        avlTree[1][4] = 0;

        // parent: root (L: 3; R: -1)
        avlTree[2][0] = 0;
        avlTree[2][1] = 3;
        avlTree[2][2] = 831954;
        avlTree[2][3] = -1;
        avlTree[2][4] = 0;

        // parent: 2 (L: -1; R: -1)
        avlTree[3][0] = 0;
        avlTree[3][1] = -1;
        avlTree[3][2] = 7485;
        avlTree[3][3] = -1;
        avlTree[3][4] = 0;

        inOrder(0);
    }

    private static void inOrder(int root) {
        if(root == -1) {
            // nothing to do
            return ;
        }

        // call function with left child
        inOrder( avlTree[root][1] );

        // print root
        System.out.println( avlTree[root][2]);

        // call function with right child
        inOrder( avlTree[root][3]);
    }
}

and the output is as expected:

73375
3005
7485
831954

I have no problem with your code either; it works fine in my test. Maybe your tree is false? I would also suggest using -1 as the right / left child if there is none; otherwise it's a bit misleading because 0 could mean the node at positon 0.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文