zoukankan      html  css  js  c++  java
  • 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()));//子节点数
    
        }
    }
    



  • 相关阅读:
    实现JSON数据的存储和读取
    MediaPlayer类——播放视频和音乐
    网络编程浅析
    线程浅析
    I/O浅析
    fragment之间的信息交互——onActivityResult()不经过Activity
    命名规则
    String方法(一)
    面试小结
    找工作中......
  • 原文地址:https://www.cnblogs.com/pilihaotian/p/8822931.html
Copyright © 2011-2022 走看看