创建一个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());

                    }

                }

            }
        }
    }
相关推荐
2401_8574396913 分钟前
SpringBoot框架在资产管理中的应用
java·spring boot·后端
怀旧66614 分钟前
spring boot 项目配置https服务
java·spring boot·后端·学习·个人开发·1024程序员节
李老头探索16 分钟前
Java面试之Java中实现多线程有几种方法
java·开发语言·面试
小沈熬夜秃头中୧⍤⃝16 分钟前
【贪心算法】No.1---贪心算法(1)
算法·贪心算法
芒果披萨21 分钟前
Filter和Listener
java·filter
qq_49244844626 分钟前
Java实现App自动化(Appium Demo)
java
阿华的代码王国34 分钟前
【SpringMVC】——Cookie和Session机制
java·后端·spring·cookie·session·会话
木向1 小时前
leetcode92:反转链表||
数据结构·c++·算法·leetcode·链表
阿阿越1 小时前
算法每日练 -- 双指针篇(持续更新中)
数据结构·c++·算法
skaiuijing1 小时前
Sparrow系列拓展篇:对调度层进行抽象并引入IPC机制信号量
c语言·算法·操作系统·调度算法·操作系统内核