二叉树-查找、插入、遍历等操作的Java实现

场景说明:

1、二叉树遍历-插入、查找、遍历操作实现

2、因为删除节点,需要重组二叉树,通常性能较低,该示例采用isDelete标识节点状态

3、适应场景:key不能重复,推荐自增序列,不允许插入之前使用过的key作为新Node的key,则能保证find/delete按照key删除指定元素(否则可能出现删除、查找不到对应元素的情况)

代码实现:

PrefixNode.java

public class PrefixNode
{
    private int key;
    
    private String data;
    
    private PrefixNode leftNode;
    
    private PrefixNode rightNode;
    
    // 由于树状结构删除需要重组,麻烦且影响性能,可以通过删除标志位标识是否已经删除
    private boolean isDelete = false;
    
    public PrefixNode()
    {
    }
    
    public PrefixNode(int key, String data)
    {
        this.key = key;
        this.data = data;
    }

    // 用于标识节点是否被删除
    // private boolean isDelete;
    
    public int getKey()
    {
        return key;
    }

    public void setKey(int key)
    {
        this.key = key;
    }

    public String getData()
    {
        return data;
    }

    public void setData(String data)
    {
        this.data = data;
    }

    public PrefixNode getLeftNode()
    {
        return leftNode;
    }

    public void setLeftNode(PrefixNode leftNode)
    {
        this.leftNode = leftNode;
    }

    public PrefixNode getRightNode()
    {
        return rightNode;
    }

    public void setRightNode(PrefixNode rightNode)
    {
        this.rightNode = rightNode;
    }

    public boolean isDelete()
    {
        return isDelete;
    }

    public void setDelete(boolean isDelete)
    {
        this.isDelete = isDelete;
    }

    @Override
    public String toString()
    {
        return "PrefixNode [key=" + key + ", data=" + data + ", leftNode="
            + leftNode + ", rightNode=" + rightNode + ", isDelete=" + isDelete
            + "]";
    }

}

Tree.java

public interface Tree
{

    // 根据节点值查询Node
    PrefixNode find(int key);
    
    // 插入节点
    boolean insert(int key, String data);
    
    // 中序遍历
    void infixOrder(PrefixNode current);
    
    // 前序遍历
    void preOrder(PrefixNode current);
    
    // 后序遍历
    void postOrder(PrefixNode current);
    
    // 查找最大值
    public PrefixNode findMax();
    
    // 查找最小值
    public PrefixNode findMin();
    
    // 插入节点
    boolean delete(int key);
}

PrefixTree.java

/**
 * 当前tree使用delete标识已删除节点
 * 
 * 适应场景:
 * key需要使用自增序列,不插入之前使用过的key作为新Node的key
 */
public class PrefixTree implements Tree
{
    private PrefixNode root;

    public PrefixNode getRoot()
    {
        return root;
    }

    public void setRoot(PrefixNode root)
    {
        this.root = root;
    }

    // 查找一个元素
    @Override
    public PrefixNode find(int key)
    {
        PrefixNode current = root;
        while (current != null)
        {
            if (current.getKey() > key)
            {
                current = current.getLeftNode();
            }
            else if (current.getKey() < key)
            {
                current = current.getRightNode();
            }
            else
            {
                if (!current.isDelete()) // 未被删除
                {
                    return current;
                }
                // 返回空
                return null;
            }
        }
        return null;
    }

    @Override
    public boolean insert(int key, String data)
    {
        PrefixNode newNode = new PrefixNode(key, data);
        if (root == null)
        {
            root = newNode;
            return true;
        }
        else
        {
            PrefixNode current = root;
            PrefixNode parent = null;
            while (current != null)
            {
                parent = current;
                if(current.getKey() > key)
                {
                    current = current.getLeftNode(); // 搜索左子节点
                    if (current == null)
                    {
                        parent.setLeftNode(newNode);
                        return true;
                    }
                }
                else
                {
                    current = current.getRightNode(); // 搜索右子节点
                    if (current == null)
                    {
                        parent.setRightNode(newNode);
                        return true;
                    }
                }
            }
        }
        return false;
    }

    @Override
    public void infixOrder(PrefixNode current)
    {
        if (current.getLeftNode() != null)
        {
            infixOrder(current.getLeftNode());
        }
        System.out.println(current + " ");
        if (current.getRightNode() != null)
        {
            infixOrder(current.getRightNode());
        }
    }

    @Override
    public void preOrder(PrefixNode current)
    {
        System.out.println(current + " ");
        if (current.getLeftNode() != null)
        {
            preOrder(current.getLeftNode());
        }
        if (current.getRightNode() != null)
        {
            preOrder(current.getRightNode());
        }        
    }

    @Override
    public void postOrder(PrefixNode current)
    {
        if (current.getLeftNode() != null)
        {
            postOrder(current.getLeftNode());
        }
        if (current.getRightNode() != null)
        {
            postOrder(current.getRightNode());
        }
        System.out.println(current + " ");
    }

    @Override
    public PrefixNode findMax()
    {
        PrefixNode current = root;
        PrefixNode maxNode = root;
        while(current != null)
        {
            maxNode = current;
            current = current.getRightNode();
        }
        return maxNode;
    }

    @Override
    public PrefixNode findMin()
    {
        PrefixNode current = root;
        PrefixNode minNode = root;
        while(current != null)
        {
            minNode = current;
            current = current.getLeftNode();
        }
        return minNode;
    }

    // 删除一个元素
    @Override
    public boolean delete(int key)
    {
        boolean flag = false;
        if (root == null)
        {
            System.out.println("tree is empty");
            return flag;
        }
        PrefixNode current = root;
        while (current != null)
        {
            if (current.getKey() > key)
            {
                current = current.getLeftNode();
            }
            else if (current.getKey() < key)
            {
                current = current.getRightNode();
            }
            else
            {
                current.setDelete(true);
                flag = true;
                return flag;
            }
        }
        return flag;
    }
    
    public static void main(String args[])
    {
        String prefix_value_str = "prefix";
        PrefixTree tree = new PrefixTree();
        for(int i=1; i<=5; i++)
        {
            tree.insert(i, prefix_value_str + i);
        }
        
        tree.insert(2, prefix_value_str + 2);
        
        // 最大元素
        System.out.println("max node: " + tree.findMax());
        
        // 最小元素
        System.out.println("min node: " + tree.findMin());
        
        // 中序 前序 后序遍历
        System.out.println("===============infixOrder======================");
        tree.infixOrder(tree.find(1));
        System.out.println("================preOrder=====================");
        tree.preOrder(tree.find(1));
        System.out.println("=================postOrder====================");
        tree.postOrder(tree.find(1));
        
        // 删除元素
        tree.delete(2);
        
        System.out.println("=================delete====================");
        // 中序 前序 后序遍历
        System.out.println("===============infixOrder======================");
        tree.infixOrder(tree.find(1));
        System.out.println("================preOrder=====================");
        tree.preOrder(tree.find(1));
        System.out.println("=================postOrder====================");
        tree.postOrder(tree.find(1));
    }
    
    
}

代码输出:

max node: PrefixNode [key=5, data=prefix5, leftNode=null, rightNode=null, isDelete=false]
min node: PrefixNode [key=1, data=prefix1, leftNode=null, rightNode=PrefixNode [key=2, data=prefix2, leftNode=null, rightNode=PrefixNode [key=3, data=prefix3, leftNode=PrefixNode [key=2, data=prefix2, leftNode=null, rightNode=null, isDelete=false], rightNode=PrefixNode [key=4, data=prefix4, leftNode=null, rightNode=PrefixNode [key=5, data=prefix5, leftNode=null, rightNode=null, isDelete=false], isDelete=false], isDelete=false], isDelete=false], isDelete=false]
===============infixOrder======================
PrefixNode [key=1, data=prefix1, leftNode=null, rightNode=PrefixNode [key=2, data=prefix2, leftNode=null, rightNode=PrefixNode [key=3, data=prefix3, leftNode=PrefixNode [key=2, data=prefix2, leftNode=null, rightNode=null, isDelete=false], rightNode=PrefixNode [key=4, data=prefix4, leftNode=null, rightNode=PrefixNode [key=5, data=prefix5, leftNode=null, rightNode=null, isDelete=false], isDelete=false], isDelete=false], isDelete=false], isDelete=false] 
PrefixNode [key=2, data=prefix2, leftNode=null, rightNode=PrefixNode [key=3, data=prefix3, leftNode=PrefixNode [key=2, data=prefix2, leftNode=null, rightNode=null, isDelete=false], rightNode=PrefixNode [key=4, data=prefix4, leftNode=null, rightNode=PrefixNode [key=5, data=prefix5, leftNode=null, rightNode=null, isDelete=false], isDelete=false], isDelete=false], isDelete=false] 
PrefixNode [key=2, data=prefix2, leftNode=null, rightNode=null, isDelete=false] 
PrefixNode [key=3, data=prefix3, leftNode=PrefixNode [key=2, data=prefix2, leftNode=null, rightNode=null, isDelete=false], rightNode=PrefixNode [key=4, data=prefix4, leftNode=null, rightNode=PrefixNode [key=5, data=prefix5, leftNode=null, rightNode=null, isDelete=false], isDelete=false], isDelete=false] 
PrefixNode [key=4, data=prefix4, leftNode=null, rightNode=PrefixNode [key=5, data=prefix5, leftNode=null, rightNode=null, isDelete=false], isDelete=false] 
PrefixNode [key=5, data=prefix5, leftNode=null, rightNode=null, isDelete=false] 
================preOrder=====================
PrefixNode [key=1, data=prefix1, leftNode=null, rightNode=PrefixNode [key=2, data=prefix2, leftNode=null, rightNode=PrefixNode [key=3, data=prefix3, leftNode=PrefixNode [key=2, data=prefix2, leftNode=null, rightNode=null, isDelete=false], rightNode=PrefixNode [key=4, data=prefix4, leftNode=null, rightNode=PrefixNode [key=5, data=prefix5, leftNode=null, rightNode=null, isDelete=false], isDelete=false], isDelete=false], isDelete=false], isDelete=false] 
PrefixNode [key=2, data=prefix2, leftNode=null, rightNode=PrefixNode [key=3, data=prefix3, leftNode=PrefixNode [key=2, data=prefix2, leftNode=null, rightNode=null, isDelete=false], rightNode=PrefixNode [key=4, data=prefix4, leftNode=null, rightNode=PrefixNode [key=5, data=prefix5, leftNode=null, rightNode=null, isDelete=false], isDelete=false], isDelete=false], isDelete=false] 
PrefixNode [key=3, data=prefix3, leftNode=PrefixNode [key=2, data=prefix2, leftNode=null, rightNode=null, isDelete=false], rightNode=PrefixNode [key=4, data=prefix4, leftNode=null, rightNode=PrefixNode [key=5, data=prefix5, leftNode=null, rightNode=null, isDelete=false], isDelete=false], isDelete=false] 
PrefixNode [key=2, data=prefix2, leftNode=null, rightNode=null, isDelete=false] 
PrefixNode [key=4, data=prefix4, leftNode=null, rightNode=PrefixNode [key=5, data=prefix5, leftNode=null, rightNode=null, isDelete=false], isDelete=false] 
PrefixNode [key=5, data=prefix5, leftNode=null, rightNode=null, isDelete=false] 
=================postOrder====================
PrefixNode [key=2, data=prefix2, leftNode=null, rightNode=null, isDelete=false] 
PrefixNode [key=5, data=prefix5, leftNode=null, rightNode=null, isDelete=false] 
PrefixNode [key=4, data=prefix4, leftNode=null, rightNode=PrefixNode [key=5, data=prefix5, leftNode=null, rightNode=null, isDelete=false], isDelete=false] 
PrefixNode [key=3, data=prefix3, leftNode=PrefixNode [key=2, data=prefix2, leftNode=null, rightNode=null, isDelete=false], rightNode=PrefixNode [key=4, data=prefix4, leftNode=null, rightNode=PrefixNode [key=5, data=prefix5, leftNode=null, rightNode=null, isDelete=false], isDelete=false], isDelete=false] 
PrefixNode [key=2, data=prefix2, leftNode=null, rightNode=PrefixNode [key=3, data=prefix3, leftNode=PrefixNode [key=2, data=prefix2, leftNode=null, rightNode=null, isDelete=false], rightNode=PrefixNode [key=4, data=prefix4, leftNode=null, rightNode=PrefixNode [key=5, data=prefix5, leftNode=null, rightNode=null, isDelete=false], isDelete=false], isDelete=false], isDelete=false] 
PrefixNode [key=1, data=prefix1, leftNode=null, rightNode=PrefixNode [key=2, data=prefix2, leftNode=null, rightNode=PrefixNode [key=3, data=prefix3, leftNode=PrefixNode [key=2, data=prefix2, leftNode=null, rightNode=null, isDelete=false], rightNode=PrefixNode [key=4, data=prefix4, leftNode=null, rightNode=PrefixNode [key=5, data=prefix5, leftNode=null, rightNode=null, isDelete=false], isDelete=false], isDelete=false], isDelete=false], isDelete=false] 
=================delete====================
===============infixOrder======================
PrefixNode [key=1, data=prefix1, leftNode=null, rightNode=PrefixNode [key=2, data=prefix2, leftNode=null, rightNode=PrefixNode [key=3, data=prefix3, leftNode=PrefixNode [key=2, data=prefix2, leftNode=null, rightNode=null, isDelete=false], rightNode=PrefixNode [key=4, data=prefix4, leftNode=null, rightNode=PrefixNode [key=5, data=prefix5, leftNode=null, rightNode=null, isDelete=false], isDelete=false], isDelete=false], isDelete=true], isDelete=false] 
PrefixNode [key=2, data=prefix2, leftNode=null, rightNode=PrefixNode [key=3, data=prefix3, leftNode=PrefixNode [key=2, data=prefix2, leftNode=null, rightNode=null, isDelete=false], rightNode=PrefixNode [key=4, data=prefix4, leftNode=null, rightNode=PrefixNode [key=5, data=prefix5, leftNode=null, rightNode=null, isDelete=false], isDelete=false], isDelete=false], isDelete=true] 
PrefixNode [key=2, data=prefix2, leftNode=null, rightNode=null, isDelete=false] 
PrefixNode [key=3, data=prefix3, leftNode=PrefixNode [key=2, data=prefix2, leftNode=null, rightNode=null, isDelete=false], rightNode=PrefixNode [key=4, data=prefix4, leftNode=null, rightNode=PrefixNode [key=5, data=prefix5, leftNode=null, rightNode=null, isDelete=false], isDelete=false], isDelete=false] 
PrefixNode [key=4, data=prefix4, leftNode=null, rightNode=PrefixNode [key=5, data=prefix5, leftNode=null, rightNode=null, isDelete=false], isDelete=false] 
PrefixNode [key=5, data=prefix5, leftNode=null, rightNode=null, isDelete=false] 
================preOrder=====================
PrefixNode [key=1, data=prefix1, leftNode=null, rightNode=PrefixNode [key=2, data=prefix2, leftNode=null, rightNode=PrefixNode [key=3, data=prefix3, leftNode=PrefixNode [key=2, data=prefix2, leftNode=null, rightNode=null, isDelete=false], rightNode=PrefixNode [key=4, data=prefix4, leftNode=null, rightNode=PrefixNode [key=5, data=prefix5, leftNode=null, rightNode=null, isDelete=false], isDelete=false], isDelete=false], isDelete=true], isDelete=false] 
PrefixNode [key=2, data=prefix2, leftNode=null, rightNode=PrefixNode [key=3, data=prefix3, leftNode=PrefixNode [key=2, data=prefix2, leftNode=null, rightNode=null, isDelete=false], rightNode=PrefixNode [key=4, data=prefix4, leftNode=null, rightNode=PrefixNode [key=5, data=prefix5, leftNode=null, rightNode=null, isDelete=false], isDelete=false], isDelete=false], isDelete=true] 
PrefixNode [key=3, data=prefix3, leftNode=PrefixNode [key=2, data=prefix2, leftNode=null, rightNode=null, isDelete=false], rightNode=PrefixNode [key=4, data=prefix4, leftNode=null, rightNode=PrefixNode [key=5, data=prefix5, leftNode=null, rightNode=null, isDelete=false], isDelete=false], isDelete=false] 
PrefixNode [key=2, data=prefix2, leftNode=null, rightNode=null, isDelete=false] 
PrefixNode [key=4, data=prefix4, leftNode=null, rightNode=PrefixNode [key=5, data=prefix5, leftNode=null, rightNode=null, isDelete=false], isDelete=false] 
PrefixNode [key=5, data=prefix5, leftNode=null, rightNode=null, isDelete=false] 
=================postOrder====================
PrefixNode [key=2, data=prefix2, leftNode=null, rightNode=null, isDelete=false] 
PrefixNode [key=5, data=prefix5, leftNode=null, rightNode=null, isDelete=false] 
PrefixNode [key=4, data=prefix4, leftNode=null, rightNode=PrefixNode [key=5, data=prefix5, leftNode=null, rightNode=null, isDelete=false], isDelete=false] 
PrefixNode [key=3, data=prefix3, leftNode=PrefixNode [key=2, data=prefix2, leftNode=null, rightNode=null, isDelete=false], rightNode=PrefixNode [key=4, data=prefix4, leftNode=null, rightNode=PrefixNode [key=5, data=prefix5, leftNode=null, rightNode=null, isDelete=false], isDelete=false], isDelete=false] 
PrefixNode [key=2, data=prefix2, leftNode=null, rightNode=PrefixNode [key=3, data=prefix3, leftNode=PrefixNode [key=2, data=prefix2, leftNode=null, rightNode=null, isDelete=false], rightNode=PrefixNode [key=4, data=prefix4, leftNode=null, rightNode=PrefixNode [key=5, data=prefix5, leftNode=null, rightNode=null, isDelete=false], isDelete=false], isDelete=false], isDelete=true] 
PrefixNode [key=1, data=prefix1, leftNode=null, rightNode=PrefixNode [key=2, data=prefix2, leftNode=null, rightNode=PrefixNode [key=3, data=prefix3, leftNode=PrefixNode [key=2, data=prefix2, leftNode=null, rightNode=null, isDelete=false], rightNode=PrefixNode [key=4, data=prefix4, leftNode=null, rightNode=PrefixNode [key=5, data=prefix5, leftNode=null, rightNode=null, isDelete=false], isDelete=false], isDelete=false], isDelete=true], isDelete=false] 

参考博文:

https://www.cnblogs.com/ysocean/p/8032642.html

猜你喜欢

转载自blog.csdn.net/zangdaiyang1991/article/details/84107856
今日推荐