本文介绍了二叉树(结构较简单的那种,没考虑很多因素进去)的基本实现功能:
1.二叉树的插入
2.二叉树的查询
3.二叉树的前序遍历、中序遍历、后序遍历
这里我首先建立了一个节点类:
//节点类 public class Node { //数据项 public int data; public String sdata; //左孩子 public Node leftChild; //右孩子 public Node rightChild; public Node(int data,String sdata) { this.data = data; this.sdata = sdata; } }
二叉树的基本功能实现:
//二叉树类 public class Tree { //根节点 public Node root; /** * 插入节点 * @param data 要插入节点中的int数据项 * @param sdata 要插入节点中的String数据项 */ public void insert(int data, String sdata) { //创建一个新节点 Node newNode = new Node(data,sdata); //若newNode是第一个节点,则将它作为根节点 if(this.root == null) { this.root = newNode; return; } Node parent = this.root; //表示要插入的位置的父节点,初始将其引用root Node child; //表示要插入的位置 //无限循环直到插入了节点 while(true) { boolean leftFlag = false; //表示要插入的节点是否在父节点的左子树 boolean rightFlag = false; //表示要插入的节点是否在父节点的右子树 //若newNode中的data比根节点的data小,则放在父节点左子树 if(parent.data>data) { child = parent.leftChild; leftFlag = true; } else { //若newNode中的data比根节点的data大或相等,则放在父节点右子树 child = parent.rightChild; rightFlag = true; } //child == null表示找到要插入的位置 if(child == null && leftFlag) { //若插入位置是父节点的左孩子 parent.leftChild = newNode; return; } else if(child == null && rightFlag) { //若插入位置是父节点的右孩子 parent.rightChild = newNode; return; } //要是还未插入成功,则把子节点重新当成父节点,再次循环查找 parent = child; } } /** * 查找节点 * @param data 需查找节点的int数据项 */ public void find(int data) { if(this.root.data == data) { System.out.println(this.root.data + ", " + this.root.sdata); return; } Node parent = this.root; Node child; //一直循环查找,直到父节点为null while(parent != null) { //若父节点的数据项为需要找的数据项 if(parent.data == data) { System.out.println(parent.data + ", " + parent.sdata); return; } //若父节点的数据项大于要找的数据项,则查找其左子树;反之查找其右子树 if(parent.data>data) { child = parent.leftChild; } else { child = parent.rightChild; } parent = child; //父节点指向child节点再次循环查找 } System.out.println("对不起,找不到该数据!"); } /** * 前序遍历二叉树 */ public void beforeOrder(Node node) { if(node == null) return; // 先访问根节点 System.out.println(node.data + ", " + node.sdata); // 再访问左子树 beforeOrder(node.leftChild); //最后访问右子树 beforeOrder(node.rightChild); } /** * 中序遍历二叉树 * 其中中序遍历普遍用的最多,因为中序遍历可以用来做排序 */ public void inOrder(Node node) { if(node == null) return; //先访问左子树 inOrder(node.leftChild); //再访问根节点 System.out.println(node.data + ", " + node.sdata); //最后访问右子树 inOrder(node.rightChild); } /** * 后序遍历 */ public void afterOrder(Node node) { if(node == null) return; //先访问左子树 afterOrder(node.leftChild); //右访问右子树 afterOrder(node.rightChild); //最后访问根节点 System.out.println(node.data + ", " + node.sdata); } }
后续还会有二叉树的其他基本功能,请见 简单二叉树的基本功能(二)。