You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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 + " ");
        }
    }
}

关键修复说明

  1. 新增rotateWithRightChild方法:这是AVL树右旋的核心逻辑,和左旋操作镜像,负责调整节点引用并更新高度,确保树的平衡。
  2. 修复inorderTraversal的分号问题:移除if (head != null)后面的分号,避免空指针异常。
  3. 调整格式:统一代码缩进和空格,提升可读性,同时修正了insertElement中高度更新的位置,确保所有分支都会更新节点高度。

内容的提问来源于stack exchange,提问作者ouie raphael

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 15:24:53