二叉排序树的基本操作

import java.util.*;
public class Main {
    public static void main(String[] args) {
        Scanner cin = new Scanner(System.in);
        int n=cin.nextInt();
        int k=cin.nextInt();
        int []a=new int[n];
        //建立二叉排序树
        BinaryTreeSort tree=new BinaryTreeSort();
        for(int i=0;i<n;i++){
            a[i]=cin.nextInt();
            tree.insert(a[i]);
        }
        //tree.InorderTravel();
        //查找元素
        for(int i=1;i<=k;i++) {
            int m = cin.nextInt();
            if(tree.find(m)){
                System.out.print(1+" ");
            }
            else{
                System.out.print(0+" ");
            }

        }
        System.out.println();
        cin.close();
    }
    public static class BinaryTreeSort {
        BinaryNode root;//根节点
        public BinaryTreeSort(){
            root=null;//初始化二叉排序树
        }
        //向二叉树插入元素,同时进行排序
        public void insert(int i)
        {
            BinaryNode node=new BinaryNode(i);//新建节点
            int count=-1;
            if(root==null)//第一次插入的情况
            {
                root=node;
            }
            else {
                BinaryNode p = root;
                while (p != null)//插入节点
                {
                    if (compare(p.getData(), i) == 1) //要插入的元素的值比根节点小
                    {
                        //左子树不为空
                        if (p.left != null) {
                            p = p.left;
                        }
                        //否则跳出当前循环
                        else {
                            count = 1;
                            break;
                        }
                    }
                    else {
                        if (p.right != null) {
                            p = p.right;
                        } else {
                            count = 0;
                            break;
                        }

                    }
                }
                if (count == 1) {
                    p.left = node;
                } else if (count == 0) {
                    p.right = node;
                }
            }
        }
        public int compare(int data, int i) {
            if(data>i)
                return 1;
            else if(data==i)
                return 0;
            else
                return - 1;
        }

        public boolean find(int m) {
            BinaryNode p=root;
            while(p!=null){
                int k=compare(p.getData(),m);
                if(k==0)//如果k=0,则找到
                {
                    return true;
                }
                else if(k==1)//当前节点大于寻找的值,向左
                {
                    p=p.left;
                }
                else//否则向左
                {
                    p=p.right;
                }
            }
            return false;
        }

        void InorderTravel(){
            travel(root);
        }
        void travel(BinaryNode T) {
            if(T!=null){
                travel(T.left);
                System.out.println(T.getData()+" ");
                travel(T.right);
            }
        }
    }
    //节点类
    private static class BinaryNode {
        BinaryNode left;//左子树
        BinaryNode right;//右子树
        int data;//数据域
        public BinaryNode(int i) {
            data=i;
            left=null;
            right=null;
        }
        public BinaryNode getLeft() {
            return left;
        }
        public void setLeft(BinaryNode left) {
            this.left = left;
        }
        public BinaryNode getRight() {
            return right;
        }
        public void setRight(BinaryNode right) {
            this.right = right;
        }

        public int getData() {
            return data;
        }
        public void setData(int data) {
            this.data = data;
        }
    }
}

二叉排序树也称为二叉搜索树,它是一种特殊的二叉树,满足以下性质: 1. 左子树中的所有节点的值均小于根节点的值; 2. 右子树中的所有节点的值均大于根节点的值; 3. 左子树和右子树也都是二叉排序树基本操作包括插入节点、删除节点和查找节点。下面是它们的实现: 1. 插入节点: 插入节点操作用于向二叉排序树中插入一个新节点。从根节点开始,比较插入节点的值与当前节点的值,如果小于当前节点的值,则进入左子树,否则进入右子树。直到找到一个空位置,将新节点插入到该位置。 示例代码如下: ```python class TreeNode: def __init__(self, val): self.val = val self.left = None self.right = None def insert_node(root, val): if root is None: return TreeNode(val) if val < root.val: root.left = insert_node(root.left, val) else: root.right = insert_node(root.right, val) return root ``` 2. 删除节点: 删除节点操作用于从二叉排序树中删除指定节点。分为三种情况: - 被删除节点没有子节点:直接删除即可; - 被删除节点只有一个子节点:将子节点替代被删除节点的位置; - 被删除节点有两个子节点:找到被删除节点的后继节点(右子树中最小的节点),将后继节点的值复制到被删除节点,然后删除后继节点。 示例代码如下: ```python def find_min(node): while node.left is not None: node = node.left return node def delete_node(root, val): if root is None: return root if val < root.val: root.left = delete_node(root.left, val) elif val > root.val: root.right = delete_node(root.right, val) else: if root.left is None: return root.right elif root.right is None: return root.left else: successor = find_min(root.right) root.val = successor.val root.right = delete_node(root.right, successor.val) return root ``` 3. 查找节点: 查找节点操作用于在二叉排序树中查找指定值的节点。从根节点开始,比较目标值与当前节点的值,如果小于当前节点的值,则进入左子树,否则进入右子树。如果找到匹配的节点,则返回该节点;如果遍历完整个树仍未找到匹配的节点,则返回空。 示例代码如下: ```python def search_node(root, val): if root is None or root.val == val: return root if val < root.val: return search_node(root.left, val) else: return search_node(root.right, val) ``` 以上是二叉排序树基本操作的实现。你可以根据需要调用这些函数来操作二叉排序树
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值