创建一个TreeNode类,定义根节点和左右孩子节点以及节点的值value并获取get set方法。

1.树的插入(直接插入)

java 复制代码
public void insert(int value) {
        //创建一个节点
        TreeNode node = new TreeNode(value);
        //如果root是null,直接插入
        if(root==null) {
            root = node;
            return;
        }
        //定义一个游标遍历整颗二叉树
        TreeNode index = root;
        //定义游标指向index的前一个地址
        TreeNode pre = null;
        while(true) {
            pre = index;
            if(index.getValue()<node.getValue()) {
                //index游标往右走
                index=index.getRightTreeNode();
                if(index==null) {
                    //插入数据
                    pre.setRightTreeNode(node);
                    return;
                }
            }else {
                //index游标往左走
                index=index.getLeftTreeNode();
                if(index==null) {
                    //插入数据
                    pre.setLeftTreeNode(node);
                    return;
                }
            }
        }

    }

2.树的插入(递归插入)

java 复制代码
 public void insertDigui(TreeNode treeNode,int value) {

        //创建一个节点
        TreeNode node = new TreeNode(value);
        //如果root是null,直接插入
        if(root==null) {
            root = node;
            return;
        }

        if(treeNode.getValue()>value) {
            //在左边插入
            if(treeNode.getLeftTreeNode()==null) {
                treeNode.setLeftTreeNode(node);
                return;
            }
            //向左递归
            insertDigui(treeNode.getLeftTreeNode(), value);
        }else {
            //在右边插入
            if(treeNode.getRightTreeNode()==null) {
                treeNode.setRightTreeNode(node);
                return;
            }
            //向右边递归
            insertDigui(treeNode.getRightTreeNode(), value);
        }

    }

3.先序遍历(父---左---右)

java 复制代码
public void beforOrder(TreeNode treeNode) {
        if(treeNode==null) {
            return;
        }
        System.out.print(treeNode.getValue()+" ");
        beforOrder(treeNode.getLeftTreeNode());
        beforOrder(treeNode.getRightTreeNode());
    }

4.中序遍历(左---父---右)

java 复制代码
 public void inOrder(TreeNode treeNode) {
        if(treeNode==null) {
            return;
        }
        inOrder(treeNode.getLeftTreeNode());
        System.out.print(treeNode.getValue()+" ");
        inOrder(treeNode.getRightTreeNode());
    }

5.后序遍历 (左---右---父)

java 复制代码
public void afterOrder(TreeNode treeNode) {
        if(treeNode==null) {
            return;
        }
        afterOrder(treeNode.getLeftTreeNode());
        afterOrder(treeNode.getRightTreeNode());
        System.out.print(treeNode.getValue()+" ");
    }

6.广度优先遍历(从根节点一次往下一层一层遍历)

java 复制代码
public void levelOrder(TreeNode treeNode) {
        LinkedList<TreeNode> queue =  new LinkedList<>();

        if(treeNode!=null) {
            queue.add(treeNode);
        }
        while(!queue.isEmpty()) {
            treeNode = queue.remove();
            System.out.print(treeNode.getValue()+" ");

            if(treeNode.getLeftTreeNode()!=null) {
                queue.add(treeNode.getLeftTreeNode());
            }
            if(treeNode.getRightTreeNode()!=null) {
                queue.add(treeNode.getRightTreeNode());
            }


        }
    }

7.查询

java 复制代码
public TreeNode find(int value) {

        if(root==null) {
            return null;
        }
        //定义index游标遍历
        TreeNode index = root;
        while(index!=null) {
            if(index.getValue()==value) {
                return index;
            }else if(index.getValue()>value) {
                index=index.getLeftTreeNode();
            }else {
                index=index.getRightTreeNode();
            }
        }

        return null;
    }

8.查找父亲节点

java 复制代码
public TreeNode findParentNode(int value,TreeNode treeNode) {

        if(treeNode==null) {
            return null;
        }
        //判断当前节点是不是目标节点的父节点
        if(treeNode.getLeftTreeNode()!=null && treeNode.getLeftTreeNode().getValue()==value ) {
            return treeNode;
        }else if(treeNode.getRightTreeNode()!=null && treeNode.getRightTreeNode().getValue()==value) {
            return treeNode;
        }else if(value>treeNode.getValue()) {
            return findParentNode(value, treeNode.getRightTreeNode());
        }else if(value<treeNode.getValue()){
            return findParentNode(value, treeNode.getLeftTreeNode());
        }else {
            return null;
        }


    }

9.找树中的最小值并删除

java 复制代码
public int min(TreeNode treeNode) {
        TreeNode index = treeNode;
        while(index.getLeftTreeNode()!=null) {
            index = index.getLeftTreeNode();
        }
        delete(index.getValue(), root);
        return index.getValue();
    }

10.删除

  1. 删除叶子节点:

1.找到要删除的节点 target

2.找要删除节点的父亲节点 parent(考虑有没有父亲节点)

3.没有父亲节点(没有父亲节点又没有子节点,这棵树只有一个节点) 即 root=null

4.如果有父亲节点 确定target是parent的左孩子还是右孩子

如果是父亲节点的左孩子 parent.left=null

如果是父亲节点的右孩子 parent.right=null

2.删除只有一颗子树的节点

1.找到要删除的节点 target

2.找要删除节点的父亲节点 parent(考虑有没有父亲节点)

3.没有父亲节点 确定target是否有左右孩子

有左孩子 root=target.left

有右孩子 root=target.right

4.有父亲节点 确定target是parent的左孩子还是右孩子

左孩子 判断target是否有左右孩子

有左孩子 parent.left=target.left

有右孩子 parent.left=target.right

右孩子 判断target是否有左右孩子

有左孩子 parent.right= target.left

有右孩子 parent.right=target.right

3.删除有两棵子树的节点

1.找到要删除的节点 target

2.找target左子树的最大值或右子树的最小值

3.替换目标节点的值

4.删掉target左子树的最大值或右子树的最小值

java 复制代码
public void delete(int value,TreeNode treeNode) {
        if(treeNode==null) {
            System.out.println("空树");
            return;
        }
        //找目标节点
        TreeNode target = find(value);
        if(target==null) {
            System.out.println("没有这个节点");
            return;
        }
        //找目标节点的父节点
        TreeNode parent = findParentNode(value, treeNode);

        //删除节点
        if(target.getLeftTreeNode()==null && target.getRightTreeNode()==null) {
            //删除的是叶子节点

            //没有父节点
            if(parent==null) {
                root=null;
            }
            //有父节点
            if(parent!=null) {
                //确定目标节点是父节点的左孩子还是右孩子
                if(parent.getLeftTreeNode()!=null && parent.getLeftTreeNode().getValue()==value) {
                    //目标节点是父节点的左孩子
                    parent.setLeftTreeNode(null);
                }else {
                    //目标节点是父节点的右孩子
                    parent.setRightTreeNode(null);
                }
            }
        }else if(target.getLeftTreeNode()!=null && target.getRightTreeNode()!=null) {
            //删除有两棵子树的节点
            //找到目标节点右子树的最小值
            int min = min(target.getRightTreeNode());
            target.setValue(min);
        }else {
            //删除有一棵子树的节点

            //没有父节点
            if(parent==null) {
                //确定目标节点有左孩子还是右孩子
                if(target.getLeftTreeNode()!=null) {
                    //目标节点有左孩子
                    root=target.getLeftTreeNode();
                }else {
                    //目标节点有右孩子
                    root=target.getRightTreeNode();
                }
            }

            //有父节点
            if(parent!=null) {
                //确定目标节点是父节点的左孩子还是右孩子
                if(parent.getLeftTreeNode()!=null && parent.getLeftTreeNode().getValue()==value) {
                    //目标节点是父节点的左孩子
                    //目标节点有左孩子还是右孩子?
                    if(target.getLeftTreeNode()!=null) {
                        //目标节点有左孩子
                        parent.setLeftTreeNode(target.getLeftTreeNode());
                    }else {
                        //目标节点有右孩子
                        parent.setLeftTreeNode(target.getRightTreeNode());

                    }

                }else {
                    //目标节点是父节点的右孩子
                    //目标节点有左孩子还是右孩子?
                    if(target.getLeftTreeNode()!=null) {
                        //目标节点有左孩子
                        parent.setRightTreeNode(target.getLeftTreeNode());
                    }else {
                        //目标节点有右孩子
                        parent.setRightTreeNode(target.getRightTreeNode());

                    }

                }

            }
        }
    }
相关推荐
jvmind_dev25 分钟前
Java GC 实战指南(番外篇):被忽视的隐形杀手 —— Class Unloading 如何拖垮 GC
java·后端
可编程芯片开发27 分钟前
基于MPPT最大功率跟踪的离网光伏发电系统Simulink建模与仿真
算法
An_s29 分钟前
机器学习python之识别图中物品信息
java·linux·开发语言
AI科技星36 分钟前
线性算子不是空间映射函数,是全域双螺旋场之间拉伸、旋转、耦合、坍缩的跨空间标准化变换载体《全域数学vs传统数学:人类文明进阶200讲》第80讲
线性代数·算法·矩阵·数据挖掘·回归·乖乖数学·全域数学
米罗篮40 分钟前
矩阵快速幂 (Exponentiation By Squaring Applied To Matrices)
c++·线性代数·算法·矩阵
dream_home84071 小时前
图像算法模型NPU适配与算法服务实战指南
人工智能·python·算法·npu 图像服务
AIGS0011 小时前
跨越语义鸿沟:企业本体语义平台的构建与落地
java·人工智能·python·机器学习·人工智能ai大模型应用
大鱼>2 小时前
多宠物家庭智能管理平台:云端架构与多设备协同实战
python·算法·iot·宠物
蓝田~2 小时前
大模型本地部署与远程调用 — 从 API 到 Agent
java·人工智能·claude·claude code
码农进化录2 小时前
Java 程序员的 AI 进化论 | Spring Boot 接入 OpenAI 的六个坑,全帮你踩了
java·spring boot·openai