【问题标题】:AVL tree in-order traversal is not workingAVL 树中序遍历不起作用
【发布时间】:2012-02-09 18:27:10
【问题描述】:

我的 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);
        }
    }
}

【问题讨论】:

  • 我想这是一个家庭作业,但声明像inorderTraversal(**final** int root) 这样的方法,它将有助于解决问题。至于 StackOverflowError - 很可能你在树中有一个循环。
  • 您不需要将其声明为最终版本。类型是 int 因此“真实”值不会改变。
  • @MasterCassim,root代表节点的当前索引,实际上是节点。代码 (root = ...) 改变了它,因此它被搞砸了。决赛是一个小费,因为这是一个家庭作业。没有“真正的”价值,而是一个有效改变的节点的索引。
  • 是的;我现在看到了; ) 如果第一个和第二个 if 在 else 的情况下执行,就会有问题。

标签: java traversal avl-tree


【解决方案1】:

我写了这个测试程序:

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 的节点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-24
    • 2016-03-14
    • 1970-01-01
    • 2020-07-16
    相关资源
    最近更新 更多