二叉树的具体特性和细节知识点,自行百度,直接上代码。
节点:节点内容、左子孩子、右子孩子、父亲
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()));//子节点数 } }