亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何使用Java中的二叉搜索樹創建獲取前一個節點的方法?

如何使用Java中的二叉搜索樹創建獲取前一個節點的方法?

慕萊塢森 2022-11-02 10:07:26
我正在研究一種使用二叉搜索樹獲取前一個節點的方法。現在我想我明白了,但是我正在努力處理我的 if 語句。指令是 getPrevNode(BSTNode) 方法應該在樹中找到參數之前的節點。這是我正在使用的算法。? 如果節點有左子節點,則向下移動左子樹以獲得最大節點? 否則,如果節點有父節點,我們需要按如下方式向上移動樹:? 如果節點是右子節點,則返回其父節點? 如果節點是左孩子,則向上移動樹直到成為右孩子并返回其父節點? 如果你到達根節點并且永遠不是右孩子,那么就沒有前一個節點讓我們注意,這也是一個輔助方法。因此,這是我到目前為止的代碼,遵循該算法。 private BSTNode<E> getPrevNode(BSTNode<E> node){    if(node.left != null)    {        return getPrevNode(node.left);    }    else if(node.parent != null)    {        if(node == node.right)        {            return node.parent;        }        else if(node == node.left)        {            return node.parent;        }    }    return getPrevNode(node);}現在我知道它不準確,但這就是我要問的原因。我將嘗試提供有關此代碼的一些信息,但我將省略一些方法,因為我不希望它太長。public class BinarySearchTree<E extends Comparable<E>>{private BSTNode<E> root; // root of overall treeprivate int numElements;private BSTNode<E> first;// post: constructs an empty search treepublic BinarySearchTree(){    this.root = null;    this.numElements = 0;}private BSTNode<E> getPrevNode(BSTNode<E> node){    if(node.left != null)    {        return getPrevNode(node.left);    }    else if(node.parent != null)    {        if(node == node.right)        {            return node.parent;        }        else if(node == node.left)        {            return node.parent;        }    }    return getPrevNode(node);} public class Iterator{    private BSTNode<E> currentNode;    public Iterator()    {        currentNode = first;    }    public boolean hasNext()    {        return currentNode != null;    }    public E next()    {        E value = currentNode.data;        currentNode = currentNode.next;        return value;    }}private static class BSTNode<E>{    public E data;    public BSTNode<E> left;    public BSTNode<E> right;    public BSTNode<E> parent;    public BSTNode<E> next;    public BSTNode(E data)    {        this(data, null, null, null, null);    }我希望這些信息有用。
查看完整描述

3 回答

?
搖曳的薔薇

TA貢獻1793條經驗 獲得超6個贊

試試這個也許:


private BSTNode<E> getPrevNode(BSTNode<E> node) {


    if(node.left != null) {

        node = node.left;

        while(node.right != null) {

            node = node.right;

        }

        return node;

    } else if(node.parent != null) {


        // If the node is a right child, return its parent

        if(node.parent.right == node) {

            return node.parent;

        }


        // If the node is a left child, move up the tree 

        // until you are a right child and return its parent

        if(node.parent.left == node) {


            while(node.parent.right != node) {


                // If you reach the root and are never a right child, no previous node return null

                if(node.parent == root) {

                    return null;

                }

                node = node.parent; 

            }

            return node.parent;


        }           

    }


    return null;

}


查看完整回答
反對 回復 2022-11-02
?
交互式愛情

TA貢獻1712條經驗 獲得超3個贊

利亞姆的回答到目前為止也是正確的,但是這是解決它的另一種方法。


private BSTNode<E> getPrevNode(BSTNode<E> node)

{

    if(node.left != null)

    {

        node = node.left;

        while(node.right != null)

        {

            node = node.right;

        }

        return node;

    }

    else if(node.parent != null)

    {

        if(node.parent.right == node)

        {

            return node.parent;

        }

        if(node.parent.left == node)

        {

            while(node.parent != null && node.parent.left == node)

            {

                node = node.parent;

            }

            if(node == root)

            {

              return null;

            }

            else

            {

              return node.parent;

            }

        }

    }

    return null;

}


查看完整回答
反對 回復 2022-11-02
?
長風秋雁

TA貢獻1757條經驗 獲得超7個贊

這是一個代碼更少的解決方案。


private BSTNode<E> getPrevNode(BSTNode<E> node, int val) {

    if (node == null) return null;

    BSTNode<E> prev = null;

    while (node != null) {

       if (val < node.data) {

          prev = node;

          node = node.left;

       } else if (val > node.data) {

          prev = node;

          node = node.right;

       } else {

          break;

       }

    }

    return node != null ? prev : null;

}


查看完整回答
反對 回復 2022-11-02
  • 3 回答
  • 0 關注
  • 149 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號