二叉树的结构与实现

来源:互联网 发布:台湾erp软件 编辑:程序博客网 时间:2024/05/29 09:16

树型结构是用来存取数据的效率比较好的一种数据结构,增,删,改效率都比前面介绍的数据结构要高。缺点就是实现起来比较复杂。下面以二叉树为例子,来说明数型结构的特点:

请看下例:

二叉树的实现:

class JD {int data;// 数据JD left; // 左儿子JD right;// 右儿子public JD(int data) {this.data = data;}public String toString() {return data + "";}};// 该类实现了增,删,改,查等特性class Tree{JD root;JD parrent;boolean b;public boolean add(int d) {// 增加数据的方法JD jd = new JD(d);if (root == null){ // 如果根节点为空,那么把新节点加给根节点root = jd;}else {JD current = root;while (current != null) {// 是找到一个位置加新节点if (d == current.data)// 如果已经存在,则直接返回false 表示加失败return false;else if (d > current.data) {// 如果该值大于当前节点,那么应该往右边找parrent = current; // 记录要加新节点的父节点b = true; // 记录是左边还是右边,current = current.right;// current.right=current} else if (d < current.data) {parrent = current;b = false;current = current.left;// current.left=current}}// end whileif (b)// 如果是右儿子为空 ,就加父节点的右边parrent.right = jd;elseparrent.left = jd;}return true;}public JD find(int d) {// 查询的方法JD current = root;while (current != null) {if (current.data == d)return current;else {parrent = current;// 记录找到节点的父节点,以方便删除操作if (d > current.data) {current = current.right;b = true;} else if (d < current.data) {current = current.left;b = false;}}}// end whilereturn current;}public boolean delete(int d) {JD current = find(d); if (current == null){return false;}else if (current.left == null && current.right == null) // 如果要删除的节点是页节点{if (current == root)// 如果是根节点(也是页节点),直接让根节点==nullroot = null;else if (b)parrent.right = null;elseparrent.left = null;} else if (current.left == null) {// 如果删除节点只有右节点if (b)parrent.right = current.right;elseparrent.left = current.right;} else if (current.right == null) {// 如果删除节点只有左节点if (b)// 该变量记录了要删除的节点,在其父节点的左边还是右边parrent.right = current.left;elseparrent.left = current.left;} else {JD temp = fenlie(current); // 分裂节点if (b)parrent.right = temp;elseparrent.left = temp;}return true;}public JD fenlie(JD c) {JD temp = c.right;JD p = temp;// 用来记录要删除节点右儿子那边的最小节点JD pp = temp;// 用来记录要删除节点右儿子那边的最小节点的父节点while (temp != null) {// 找到要删除节点右儿子那边的最小节点pp = p;p = temp;temp = temp.left;}if (pp == p) {// 如果删除节点的右儿子节点没有左儿子pp.left = c.left;// 把删除节点左儿子加到删除节点的右儿子的左边return pp;} else {pp.left = p.right;// 把找到的节点的右儿子部分加到该节点父节点的左边p.left = c.left;// 把删除节点的左儿子加到分裂节点的左边p.right = c.right;// 把删除节点的右儿子加到分裂节点的右边return p;}}public boolean modify(int s, int m) {// 修改数据的方法=先删除后增加,这样还是有//顺序的delete(s);return add(m);}public void print(JD jd) {// 递归中序遍历该有序二叉树if (jd != null) {print(jd.left);System.out.print(jd + " ");print(jd.right);}}public void p() {print(root);}}class TestTree {public static void main(String[] args) {Tree t = new Tree();t.add(5);t.add(7);t.add(3);t.add(9);t.add(1);t.add(8);t.add(13);t.add(4);t.p();System.out.println("\n" + "-------------改变----------");t.modify(8, 18);// 把接点值为8的接点,把该值改为18t.delete(9);// 删除接点值为9的接点t.p();}}

运行的结果如图


原创粉丝点击