データ構造-二分探索木の簡単な実装(Java)

二分探索木を使用すると、ツリーを組み合わせて並べ替えるというアイデアをよりよく理解するのに役立ちます。反復であろうと再帰であろうと、すべてのトラバーサルは論理的思考能力を調べることです。それをしなさい。

SearchTreeNodeクラス

package 数据结构_二叉搜索树;

public class SearchTreeNode {
    
    
    private int element;
    private SearchTreeNode left,right;

    public SearchTreeNode(int element) {
    
    
        this.element = element;
        left = null;
        right = null;
    }

    public int getElement() {
    
    
        return element;
    }

    public void setElement(int element) {
    
    
        this.element = element;
    }

    public SearchTreeNode getLeft() {
    
    
        return left;
    }

    public void setLeft(SearchTreeNode left) {
    
    
        this.left = left;
    }

    public SearchTreeNode getRight() {
    
    
        return right;
    }

    public void setRight(SearchTreeNode right) {
    
    
        this.right = right;
    }
}

Ordertreeクラス

package 数据结构_二叉搜索树;

import 数据结构_二叉树.BinaryTreeNode;

public class Ordertree {
    
    
    /**
     * 前序遍历
     * @param root a root of preorder
     */
    public void preorder(SearchTreeNode root){
    
    
        if(root.getLeft() == null && root.getRight() == null){
    
    
            System.out.print(root.getElement()+" ");
            return;
        }
        else{
    
    
            System.out.print(root.getElement()+" ");
            if(root.getLeft() != null)
                preorder(root.getLeft());
            if(root.getRight() != null)
                preorder(root.getRight());
        }
    }

    /**
     * 中序遍历
     * @param root root a root of infixorder
     */
    public void infixorder(SearchTreeNode root){
    
    
        if(root.getLeft() == null && root.getRight() == null){
    
    
            System.out.print(root.getElement()+" ");
            return;
        }
        else{
    
    
            if(root.getLeft() != null)
                infixorder(root.getLeft());
            System.out.print(root.getElement()+" ");
            if(root.getRight() != null)
                infixorder(root.getRight());
        }
    }

    /**
     * 后序遍历
     * @param root root a root of postorder
     */
    public void postorder(SearchTreeNode root){
    
    
        if(root.getLeft() == null && root.getRight() == null){
    
    
            System.out.print(root.getElement()+" ");
            return;
        }
        else{
    
    
            if(root.getLeft() != null)
                postorder(root.getLeft());
            if(root.getRight() != null)
                postorder(root.getRight());
            System.out.print(root.getElement()+" ");
        }
    }
}

SearchLinkedTreeクラス

package 数据结构_二叉搜索树;

import 数据结构_二叉树.TraversalTree;

public class SearchLinkedTree {
    
    
    public SearchLinkedTree() {
    
    
    }
//添加元素方法,尝试了迭代遍历结点
    public void addElement(int element,SearchTreeNode node) {
    
    
        if (node == null)
            node.setElement(element);
        while (node != null) {
    
    
            if (element < node.getElement()) {
    
    
                if (node.getLeft() == null) {
    
    
                    node.setLeft(new SearchTreeNode(element));
                    System.out.println(element+"插到了"+node.getElement()+"左边");
                    break;
                }
                node = node.getLeft();
            } else {
    
    
                if (node.getRight() == null) {
    
    
                    node.setRight(new SearchTreeNode(element));
                    System.out.println(element+"插到了"+node.getElement()+"右边");
                    break;
                }
                node = node.getRight();
            }
        }
    }
  //删除结点元素方法,利用中序递归遍历。flag属性用来查看是否删除成功
    int flag = 0;
    public void removeElement(int element,SearchTreeNode root){
    
    
        if(root.getElement() == element){
    
    
            root.setElement(root.getRight().getElement());
            root.setRight(null);
            flag = 1;
        }
        if(root.getLeft() == null && root.getRight() == null){
    
    
            return;
        }
        else{
    
    
            if(root.getLeft() != null)
                removeElement(element,root.getLeft());
            if(root.getRight() != null)
                removeElement(element,root.getRight());
        }
    }
//生成order对象,用来遍历二叉搜索树
    public void order(SearchTreeNode root){
    
    
        Ordertree tra = new Ordertree();
        System.out.print("\n前序:");
        tra.preorder(root);
        System.out.print("\n中序:");
        tra.infixorder(root);
        System.out.print("\n后序:");
        tra.postorder(root);
    }
}

テストクラス

package 数据结构_二叉搜索树;

public class TEST {
    
    
    public static void main(String[] args) {
    
    
        SearchLinkedTree root = new SearchLinkedTree();
        SearchTreeNode node = new SearchTreeNode(3);
        
        root.addElement(5,node);
        root.addElement(2,node);
        root.addElement(7,node);
        root.addElement(1,node);
        root.addElement(4,node);

        root.order(node);
        root.removeElement(5,node);
        if(root.flag == 1){
    
    
            System.out.println("\n\n(Deleted successfully!!!)");
            root.order(node);
        }
        else
            System.out.println("\n\n(Sorry,not find this element!!!)");

    }
}

おすすめ

転載: blog.csdn.net/baldicoot_/article/details/104661943