【code】java实现排序二叉树

来源:互联网 发布:数字集成电路用啥软件 编辑:程序博客网 时间:2024/06/03 19:26

 

import java.util.*;public class SortedBinTree<T extends Comparable>{static class Node{Object data;Node parent; Node left;Node right;public Node(Object data , Node parent , Node left , Node right){this.data = data;this.parent = parent;this.left = left;this.right = right;}public String toString(){return "[data=" + data + "]"; }public boolean equals(Object obj){if (this == obj){return true;}if (obj.getClass() == Node.class){Node target = (Node)obj;return data.equals(target.data)&& left == target.left&& right == target.right&& parent == target.parent;}return false;}}private Node root;//两个构造器用于创建排序二叉树public SortedBinTree(){root = null;}public SortedBinTree(T o){root = new Node(o , null , null , null);}//添加节点public void add(T ele){//如果根节点为nullif (root == null){root = new Node(ele , null , null , null);}else{Node current = root;Node parent = null;int cmp = 0;//搜索合适的叶子节点,以该叶子节点为父节点添加新节点do{parent = current;cmp = ele.compareTo(current.data);//如果新节点的值大于当前节点的值if (cmp > 0){//以右子节点作为当前节点current = current.right;}//如果新节点的值小于当前节点的值else{//以左子节点作为当前节点current = current.left;}}while (current != null);//创建新节点Node newNode = new Node(ele , parent , null , null);//如果新节点的值大于父节点的值if (cmp > 0){//新节点作为父节点的右子节点parent.right = newNode;}//如果新节点的值小于父节点的值else{//新节点作为父节点的左子节点parent.left = newNode;}}}//删除节点,采用的是11. 25图的左边情形public void remove(T ele){//获取要删除的节点Node target = getNode(ele);if (target == null){return;}//左、右子树为空if (target.left == null&& target.right == null){//被删除节点是根节点if (target == root){root = null;}else{//被删除节点是父节点的左子节点if (target == target.parent.left){//将target的父节点的left设为nulltarget.parent.left = null;}else{//将target的父节点的right设为nulltarget.parent.right = null;}target.parent = null;}}//左子树为空,右子树不为空else if (target.left == null&& target.right != null){//被删除节点是根节点if (target == root){root = target.right;}else{//被删除节点是父节点的左子节点if (target == target.parent.left){//让target的父节点的left指向target的右子树target.parent.left = target.right;}else{//让target的父节点的right指向target的右子树target.parent.right = target.right;}//让target的右子树的parent指向target的parenttarget.right.parent = target.parent;}}//左子树不为空,右子树为空else if(target.left != null&& target.right == null){//被删除节点是根节点if (target == root){root = target.left;}else{//被删除节点是父节点的左子节点if (target == target.parent.left){//让target的父节点的left指向target的左子树target.parent.left = target.left;}else{//让target的父节点的right指向target的左子树target.parent.right = target.left;}//让target的左子树的parent指向target的parenttarget.left.parent = target.parent;}}//左、右子树都不为空else{//leftMaxNode用于保存target节点的左子树中值最大的节点Node leftMaxNode = target.left;//搜索target节点的左子树中值最大的节点while (leftMaxNode.right != null){leftMaxNode = leftMaxNode.right;}//从原来的子树中删除leftMaxNode节点leftMaxNode.parent.right = null;//让leftMaxNode的parent指向target的parentleftMaxNode.parent = target.parent;//被删除节点是父节点的左子节点if (target == target.parent.left){//让target的父节点的left指向leftMaxNodetarget.parent.left = leftMaxNode;}else{//让target的父节点的right指向leftMaxNodetarget.parent.right = leftMaxNode;}leftMaxNode.left = target.left;leftMaxNode.right = target.right;target.parent = target.left = target.right = null;//删除原来的节点}}//根据给定的值搜索节点public Node getNode(T ele){//从根节点开始搜索Node p = root;while (p != null) {int cmp = ele.compareTo(p.data);//如果搜索的值小于当前p节点的值if (cmp < 0){//向左子树搜索p = p.left;}//如果搜索的值大于当前p节点的值else if (cmp > 0){//向右子树搜索p = p.right;}else{return p;}}return null;}//广度优先遍历public List<Node> breadthFirst(){Queue<Node> queue = new ArrayDeque<Node>();List<Node> list = new ArrayList<Node>();if( root != null){//将根元素加入“队列”queue.offer(root);}while(!queue.isEmpty()){//将该队列的“队尾”的元素添加到List中list.add(queue.peek());Node p = queue.poll();//如果左子节点不为null,将它加入“队列”if(p.left != null){queue.offer(p.left);}//如果右子节点不为null,将它加入“队列”if(p.right != null){queue.offer(p.right);}}return list;}//实现中序遍历      public List<Node> inIterator()      {          return inIterator(root);      }      private List<Node> inIterator(Node node)      {          List<Node> list = new ArrayList<Node>();          //递归处理左子树          if (node.left != null)          {              list.addAll(inIterator(node.left));          }          //处理根节点          list.add(node);          //递归处理右子树          if (node.right != null)          {              list.addAll(inIterator(node.right));          }          return list;      }  public static void main(String[] args) {SortedBinTree<Integer> tree = new SortedBinTree<Integer>();//添加节点tree.add(5);tree.add(20);tree.add(10);tree.add(3);tree.add(8);tree.add(15);tree.add(30);System.out.println(tree.breadthFirst());//删除节点tree.remove(20);System.out.println(tree.breadthFirst());}}
 

 

 




 

 

  • 大小: 154.9 KB
  • 大小: 136.2 KB
  • 大小: 117.2 KB
  • 查看图片附件