AVL树Java代码报错:cannot find symbol rotateWithRightChild如何解决?
解决AVL树Java代码的"cannot find symbol: rotateWithRightChild"编译错误
你遇到的编译错误核心原因是:代码中多次调用了rotateWithRightChild方法,但从未定义过这个方法。AVL树的平衡旋转需要成对实现左旋(rotateWithLeftChild)和右旋(rotateWithRightChild),你只完成了左旋的代码,缺少右旋的实现。
同时你的代码还有一个潜在bug:inorderTraversal方法中if (head != null);后面多了一个分号,会导致无论head是否为空,都会执行后续遍历代码,触发空指针异常。
修复后的完整代码
class Node { int element; int h; Node leftChild; Node rightChild; public Node() { leftChild = null; rightChild = null; element = 0; h = 0; } public Node(int element) { leftChild = null; rightChild = null; this.element = element; h = 0; } } class ConstructAVLTree { private Node rootNode; public ConstructAVLTree() { rootNode = null; } public void removeAll() { rootNode = null; } public boolean checkEmpty() { if(rootNode == null) return true; else return false; } public void insertElement(int element) { rootNode = insertElement (element, rootNode); } private int getHeight(Node node) { return node == null ? -1 : node.h; } private int getMaxHeight(int leftNodeHeight, int rightNodeHeight) { return leftNodeHeight > rightNodeHeight ? leftNodeHeight : rightNodeHeight; } private Node insertElement(int element, Node node) { if (node == null) node = new Node(element); else if (element < node.element) { node.leftChild = insertElement(element, node.leftChild); if (getHeight(node.leftChild) - getHeight(node.rightChild) == 2) if (element < node.leftChild.element) node = rotateWithLeftChild(node); else node = doubleWithLeftChild(node); } else if (element > node.element) { node.rightChild = insertElement(element, node.rightChild); if (getHeight(node.rightChild) - getHeight(node.leftChild) == 2) if (element > node.rightChild.element) node = rotateWithRightChild(node); else node = doubleWithRightChild(node); } node.h = getMaxHeight(getHeight(node.leftChild), getHeight(node.rightChild)) + 1; return node; } // 左旋实现(原代码已有) private Node rotateWithLeftChild(Node node2) { Node node1 = node2.leftChild; node2.leftChild = node1.rightChild; node1.rightChild = node2; node2.h = getMaxHeight(getHeight(node2.leftChild), getHeight(node2.rightChild)) + 1; node1.h = getMaxHeight(getHeight(node1.leftChild), node2.h) + 1; return node1; } // 新增右旋实现 private Node rotateWithRightChild(Node node1) { Node node2 = node1.rightChild; node1.rightChild = node2.leftChild; node2.leftChild = node1; node1.h = getMaxHeight(getHeight(node1.leftChild), getHeight(node1.rightChild)) + 1; node2.h = getMaxHeight(getHeight(node2.rightChild), node1.h) + 1; return node2; } private Node doubleWithLeftChild(Node node3) { node3.leftChild = rotateWithRightChild(node3.leftChild); return rotateWithLeftChild(node3); } private Node doubleWithRightChild(Node node1) { node1.rightChild = rotateWithLeftChild(node1.rightChild); return rotateWithRightChild(node1); } public int getTotalNumberOfNodes() { return getTotalNumberOfNodes(rootNode); } private int getTotalNumberOfNodes(Node head) { if (head == null) return 0; else { int length = 1; length += getTotalNumberOfNodes(head.leftChild); length += getTotalNumberOfNodes(head.rightChild); return length; } } public boolean searchElement(int element) { return searchElement(rootNode, element); } private boolean searchElement(Node head, int element) { boolean check = false; while ((head != null) && !check) { int headElement = head.element; if (element < headElement) head = head.leftChild; else if (element > headElement) head = head.rightChild; else { check = true; break; } check = searchElement(head, element); } return check; } public void inorderTraversal() { inorderTraversal(rootNode); } private void inorderTraversal(Node head) { // 修复:移除多余的分号 if (head != null) { inorderTraversal(head.leftChild); System.out.print(head.element + " "); inorderTraversal(head.rightChild); } } public void preorderTraversal() { preorderTraversal(rootNode); } private void preorderTraversal(Node head) { if (head != null) { System.out.print(head.element + " "); preorderTraversal(head.leftChild); preorderTraversal(head.rightChild); } } public void postorderTraversal() { postorderTraversal(rootNode); } private void postorderTraversal(Node head) { if (head != null) { postorderTraversal(head.leftChild); postorderTraversal(head.rightChild); System.out.print(head.element + " "); } } }
关键修复说明
- 新增
rotateWithRightChild方法:这是AVL树右旋的核心逻辑,和左旋操作镜像,负责调整节点引用并更新高度,确保树的平衡。 - 修复
inorderTraversal的分号问题:移除if (head != null)后面的分号,避免空指针异常。 - 调整格式:统一代码缩进和空格,提升可读性,同时修正了
insertElement中高度更新的位置,确保所有分支都会更新节点高度。
内容的提问来源于stack exchange,提问作者ouie raphael
相关产品推荐
相关产品推荐

