java 队列和二叉树代码

来源:互联网 发布:注册淘宝也是支付宝 编辑:程序博客网 时间:2024/06/05 17:57

队列

public class MyQueue{private Object datas[];private int pushIndex;//入队的下标private int popIndex; //出队的下标private int counts;//记录数据的个数public MyQueue(int size){datas = new Object[size];}public MyQueue(){this(10);}public boolean isEmpty(){return counts == 0;}public String toString(){StringBuilder mess = new StringBuilder();for (int i = popIndex; i <= counts; i++) {mess.append(datas[i % datas.length] + ",");}return mess + "";}public boolean isFull(){return counts == datas.length;}/** * 入队列 * @param data */public void push(Object data) {if (isFull()) {return;}datas[pushIndex++ % datas.length] = data;counts++;}public Object popup(){Object data = datas[popIndex++ % datas.length];counts--;return data;}}


测试

//初始化队列MyQueue queue = new MyQueue(6);//六个人入队for (int i = 0;i < 6; i++) {queue.push(i + 1);}//数数int counts = 0;//计数器while (!queue.isEmpty()) {Object d = queue.popup();counts++;//判断if (counts % 3 == 0) {System.out.println(d);} else {queue.push(d);//再放进队列}}


二叉树

public class MyTree{private Noderoot;// 根节点private class Node{Nodeparrent;// 父节点Nodeleft;// 左儿子Noderight;// 右儿子Objectdata;public Node(Object data) {this.data = data;}}/** * @param data *            传递的数据 * @return 父节点的值 */private Node findParrent(Object data, Node currentNode) {// 从根节点找Node temp = currentNode;Node parrent = currentNode;// 循环找while (temp != null) {parrent = temp;// 比较if (compare(data, temp.data)) {// data 大于 当前节点temp = temp.right;} else {// data 小于 当前节点temp = temp.left;}}return parrent;}public void update(Object oldData,Object newData){remove(oldData);add(newData);}/** * 添加数据 *  * @param data *            要添加的数据 */public void add(Object data) {// 判断该数据是否存在if (contains(data))return;// 1.把数据放到节点中Node node = new Node(data);// 2.把节点链接到二叉树中// 是否有根节点if (root == null) {root = node;// 保存到根节点中} else {// 找位置,找父节点,比较父节点的值,小左边 大右边Node parrent = findParrent(data, root);// 设置新增节点的父节点node.parrent = parrent;// 比较if (compare(data, parrent.data)) {// 自己比父节点大parrent.right = node;} else {// 自己比父节点小parrent.left = node;}}}/** * @param data * @return 是否包含该数据 */public boolean contains(Object data) {return null != find(data);}private Node find(Object data) {Node temp = root;// 从根节点找while (temp != null) {// 判断数据if (temp.data.equals(data)&& temp.data.hashCode() == data.hashCode()) {// 找到数据break;} else if (compare(data, temp.data)) {// true data > temp// 从右边找temp = temp.right;} else {// false data < temp// 从坐标边找temp = temp.left;}}return temp;}public void remove(Object data) {// 1. 查找数据是否存在Node temp = find(data);// 2. 存在:找到数据节点if (temp != null) {// 存在// 3. 删除节点// 1. 根节点if (temp == root) {// 11 没有儿子if (temp.left == null && temp.right == null) {root = null;} else if (temp.right == null) {root = root.left;root.parrent = null;// 12 只有左儿子} else if (temp.left == null) {// 13 只有右儿子root = root.right;root.parrent = null;} else {// 14 两个儿子都有// 保留左儿子Node left = getLeft(temp);// left成为新的根节点root = left;left.parrent = null;}} else {// 2. 非根节点if (temp.left == null && temp.right == null) {// 21 没有儿子if (compare(temp.data, temp.parrent.data)) {//在父节点右边temp.parrent.right = null;} else {//在父节点左边temp.parrent.left = null;}} else if (temp.right == null) {// 22 只有左儿子if (compare(temp.data, temp.parrent.data)) {//在父节点右边temp.parrent.right = temp.left;temp.left.parrent = temp.parrent;} else {//在父节点左边temp.parrent.left = temp.left;temp.left.parrent = temp.parrent;}} else if (temp.left == null) {// 23 只有右儿子if (compare(temp.data, temp.parrent.data)) {//在父节点右边temp.parrent.right = temp.right;temp.right.parrent = temp.parrent;} else {//在父节点左边temp.parrent.left = temp.right;temp.right.parrent = temp.parrent;}} else {// 24 两个儿子都有Node left = getLeft(temp);//上面还有父节点(爷爷)if (compare(left.data, temp.parrent.data)) {//比爷爷节点大temp.parrent.right = left;left.parrent = temp.parrent;} else  {//比爷爷节点小temp.parrent.left = left;left.parrent = temp.parrent;}}}}}/** * @param node *            要删除的节点 * @return 左儿子节点 */private Node getLeft(Node node) {// 保留左儿子Node left = node.left;// 处理右节点Node rightNewParrent = findParrent(node.right.data, left);rightNewParrent.right = node.right;// 把删除节点的右节点放到删除节点的左儿子最右边node.right.parrent = rightNewParrent;return left;}/** * @param o1 *            第一个值 * @param o2 *            第二个值 * @return 如果o1 大于 o2 返回true 否则false */public boolean compare(Object o1, Object o2) {boolean res = false;// 判断o1 有没有实现比较器if (o1 instanceof Comparable) {Comparable c1 = (Comparable) o1;Comparable c2 = (Comparable) o2;if (c1.compareTo(c2) > 0) {res = true;} else {// 默认值就是false}} else {// 传递的对象没有比较器res = o1.toString().compareTo(o2.toString()) > 0 ? true : false;}return res;}// 递归打印public void print() {print(root);}public void print(Node node) {if (node == null) {return;} else {// 遍历 中序print(node.left);System.out.println(node.data + ",");print(node.right);}}}

测试

MyTree trees = new MyTree();int[] datas = {55,33,44,88,66,99};for (int d : datas) {trees.add(d);}trees.print();System.out.println();//测试删除trees.update(33,77);trees.print();



0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 孩子幼儿园被打怎么办 两个家长吵架老师怎么办 家长和老师矛盾怎么办 孩子特别害怕老师怎么办? 老师排挤孤立孩子怎么办 很害怕一件事怎么办 高中老师误会我怎么办 家长讹老师老师怎么办 小孩子老说头疼怎么办 孩子总是否定自己怎么办 孩子总是否定别人怎么办 老师屏蔽家长该怎么办 初二学生学疲劳怎么办 孩子不愿补英语怎么办 培训班孩子不学怎么办 小孩不想去学校怎么办 讨厌父母的性格怎么办 老师揪孩子耳朵怎么办 老师整天骂孩子怎么办 教师被学生骂怎么办 幼儿园学生骂老师怎么办 学生骂老师外号怎么办 小孩上课很多嘴怎么办 学生老玩手机怎么办 和校长有了矛盾怎么办 家长打了我怎么办 小朋友不想去幼儿园怎么办 小朋友不想上幼儿园怎么办 高中老师打学生家长怎么办 老师偏心学生该怎么办? 老师能打孩子怎么办 有的幼儿打老师怎么办? 孩子特别怕老师怎么办 孩子跟老师认生怎么办 和搭班老师不合怎么办 学生厌学了老师怎么办 孩子很怕我怎么办 斗米报名之后怎么办 孩子鼻子长疮怎么办 六年级孩子不爱学习怎么办 孩子不要爱学习怎么办?