• Java-二叉树-插入、删除、遍历


    二叉树的具体特性和细节知识点,自行百度,直接上代码。

    节点:节点内容、左子孩子、右子孩子、父亲

    class Node {
        private int data;
        private Node leftChild;
        private Node rightChild;
        private Node parent;
    
        public Node getParent() {
            return parent;
        }
    
        public void setParent(Node parent) {
            this.parent = parent;
        }
    
        public Node(int data, Node leftChild, Node rightChild, Node parent) {
            this.data = data;
            this.leftChild = leftChild;
            this.rightChild = rightChild;
            this.parent = parent;
    
        }
    
        public int getData() {
            return data;
        }
    
        public void setData(int data) {
            this.data = data;
        }
    
        public Node getLeftChild() {
            return leftChild;
        }
    
        public void setLeftChild(Node leftChild) {
            this.leftChild = leftChild;
        }
    
        public Node getRightChild() {
            return rightChild;
        }
    
        public void setRightChild(Node rightChild) {
            this.rightChild = rightChild;
        }
    
    }


    二叉树构造和操作:

    public class BinaryTree {
        private Node root;//根节点
        //插入节点
        public void insertNode(Node root, Node node) {
    
            Node current = root;
            while (true) {
                if (node.getData() < current.getData()) {
                    if (current.getLeftChild() == null) {
                        node.setParent(current);
                        current.setLeftChild(node);
                        break;
                    } else {
                        current = current.getLeftChild();
                    }
                } else {
                    if (current.getRightChild() == null) {
                        node.setParent(current);
                        current.setRightChild(node);
                        break;
                    } else {
                        current = current.getRightChild();
                    }
    
                }
            }
        }
        //删除节点
        public void deleteNode(Node node) {
            if (node.equals(root)) {
                root = null;
            } else if (node.getParent() != null) {
                if (node == node.getParent().getLeftChild()) {
                    node.getParent().setLeftChild(null);
                } else {
                    node.getParent().setRightChild(null);
    
                }
            }
        }
    
        //获取某节点的高度
        public int geHeight(Node node) {
            if (node == null) {
                return 0;
            } else {
                int leftHeight = geHeight(node.getLeftChild());
                int rightHeight = geHeight(node.getRightChild());
                int max = Math.max(leftHeight, rightHeight);
                return max + 1;
            }
        }
    
        //获取某节点的子节点个数
        public int getChildNodes(Node node) {
            if (node == null) {
                return 0;
            } else {
                int leftNodes = getChildNodes(node.getLeftChild());
                int rightNodes = getChildNodes(node.getRightChild());
                return leftNodes + rightNodes + 1;
            }
        }
    
        //先序遍历树
        public void PreOrder(Node root) {
            if (root == null)
                return;
            System.out.print(root.getData() + " ");
            PreOrder(root.getLeftChild());
            PreOrder(root.getRightChild());
        }
    
        //中序
        public void MidOrder(Node root) {
            if (root == null) return;
            MidOrder(root.getLeftChild());
            System.out.print(root.getData() + " ");
            MidOrder(root.getRightChild());
        }
    
        //后序
        public void LastOrder(Node root) {
            if (root == null) return;
            LastOrder(root.getLeftChild());
            LastOrder(root.getRightChild());
            System.out.print(root.getData() + " ");
    
        }
    
        public BinaryTree() {
    
        }
    
        public BinaryTree(Node root) {
            this.root = root;
        }
    
        public Node getRoot() {
            return root;
        }
    
        public void setRoot(Node root) {
            this.root = root;
        }
    
    }
    

    测试:

    public class Main {
        public static void main(String[] args) {
            BinaryTree bt = new BinaryTree(new Node(1, null, null, null));
            int a[] = {5, 3, 2, 7, 4, 9, 8};
            for (int i = 0; i < 7; i++) {
                bt.insertNode(bt.getRoot(), new Node(a[i], null, null, null));
            }
    //        System.out.println(bt.geHeight(root));//高度
    //        bt.PreOrder(root);
    //        System.out.println();
    //        bt.MidOrder(root);
    //        System.out.println();
    //        bt.LastOrder(root);
    //        System.out.println();
    //        bt.deleteNode(bt.getRoot());
    //        bt.PreOrder(bt.getRoot());
     //       System.out.println(bt.getChildNodes(bt.getRoot()));//子节点数
    
        }
    }
    



  • 相关阅读:
    关于python3导出excel图片链接转图片且图片内嵌表格内实现
    ios下载指定版本frida
    frida打印类下方法模板
    IDEA 报错 Package 'java.util' is declared in module 'java.base', which is not in the module graph
    linux统计当前路径下的文件数量
    Mac 中配置鼠标右键 Open Tabby here
    取消vim粘贴时自动注释功能
    mac 安装字体
    scp 命令提示 Permission denied, please try again.解决方法
    VScode 中如何取消设置文件内容可以滚动到最后一行之后
  • 原文地址:https://www.cnblogs.com/pilihaotian/p/8822931.html
Copyright © 2020-2023  润新知