写点什么

排序二叉树 JAVA 版实现

作者:Java高工P7
  • 2021 年 11 月 12 日
  • 本文字数:2703 字

    阅读完需:约 9 分钟

*/


private TreeNode<E> add0(TreeNode<E> root, E e) {


final TreeNode<E> curNode = root;


int cmp = compare(e, curNode.value);


if(cmp < 0 ) { //表示待插入的节点值,比当前节点值小


if(curNode.left == null) {


//创建当前节点的左节点


TreeNode<E> newNode = new TreeNode<E>(e, curNode);


curNode.left = newNode;


return newNode;


} else {


return add0(curNode.left, e);//遍历左子树


}


} else { // 大于等于 0,右子树


if(curNode.right == null ) {


//创建当前节点的右节点


TreeNode<E> newNode = new TreeNode<E>(e, curNode);


curNode.right = newNode;


return newNode;


} else {


return add0(curNode.right, e);//遍历右子树


}


}


}


/**


  • 比较两个元素的大小

  • @param e1

  • @param e2

  • @return


*/


@SuppressWarnings("unchecked")


private int compare(E e1, E e2) {


return comparator == null ? ((Comparable<E>) e1 ).compareTo(e2) : comparator.compare(e1, e2);


}


/**


  • 删除元素

  • @param e

  • @return 如果返回 ture,表示删除成功,如果返回 false,表示删除失败,没有找到元素


*/


public boolean remove(E e) {


if( e == null ) return false;


TreeNode<E> cur = root;


int cmp;


while (cur != null ) {


if(e.equals(cur.value)) {


break;


}


cmp = compare(e, root.value);


if(cmp < 0 ) { //表示待删除的节点值,比当前节点值小


cur = cur.left;


} else {


cur = cur.right;


}


}


if(cur != null ) { //找到了元素,需要删除该元素


TreeNode<E> cLeft = cur.left;


TreeNode<E> cRight = cur.right;


if(cLeft != null ) { //如果被删除节点的左子树不为空,则将左子树放入当前节点的位置


remove0(cLeft, cur);


if(cLeft.right != null && cur.right != null) { //需要移动相应节点


TreeNode<E> wNode = cLeft.right;


cLeft.right = cur.right;


wNode.parent = null;


TreeNode<E> newNode = add0(cLeft, wNode.value);


newNode.left = wNode.left;


newNode.right = wNode.right;


wNode = null;


}


} else {


remove0(cRight, cur);


}


//将当前节点释放,,help GC


cur.value = null;


cur.right = null;


cur.left = null;


cur.parent = null;


cur = null;


return true;


}


return false;


}


private void remove0(TreeNode<E> newNode, TreeNode<E> cur) {


TreeNode<E> parent = cur.parent;


newNode.parent = parent;


if(cur.parent.left == cur) {


cur.parent.left = newNode;


} else {


cur.parent.right = newNode;


}


}


/**


  • 中序遍历


*/


public void middleOrderTraversal() {


System.out.println("----------中序遍历开始---------\n");


if (root == null) {


System.out.print("二叉树");


System.out.println("----------中序遍历结束---------\n");


return;


}


middleOrderTraversal0(root);


System.out.println("\n----------中序遍历结束---------\n");


}


/**


  • 中序遍历


*/


private void midd


【一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义】
浏览器打开:qq.cn.hn/FTf 免费领取
复制代码


leOrderTraversal0(TreeNode<E> root) {


if (root == null)


return;


final TreeNode<E> cur = root;


if (cur.left != null) {


middleOrderTraversal0(cur.left);


System.out.print(toObjectString(cur.value) + ",");


middleOrderTraversal0(cur.right);


} else if (cur.right != null) {


System.out.print(cur.value + ",");


middleOrderTraversal0(cur.right);


} else {


// 此时输出节点


System.out.print(cur.value + ",");


}


}


public TreeNode<E> getRoot() {


return root;


}


public void setRoot(TreeNode<E> root) {


this.root = root;


}


private String toObjectString(E value) {


return value == null ? "" : value.toString();


}


/**


  • 二叉数

  • @author Administrator

  • @param <E>


*/


@SuppressWarnings("unused")


private final static class TreeNode<E> implements Serializable {


private static final long serialVersionUID = 6540618639489225256L;


public E value;


public TreeNode<E> left;


public TreeNode<E> right;


public TreeNode<E> parent;


public TreeNode(E value, TreeNode<E> parent) {


super();


this.value = value;


this.parent = parent;


}


public TreeNode(E value, TreeNode<E> left, TreeNode<E> right, TreeNode<E> parent) {


super();


this.value = value;


this.left = left;


this.right = right;


this.parent = parent;


}


@Override


public String toString() {


if(value != null)


return value.toString();


return super.toString();


}


}


/** *******************测试 start ***************************/


public static void main(String[] args) {


// TODO Auto-generated method stub


System.out.println("测试开始");


// BinaryTree<Integer> t = new BinaryTree<Integer>();


// t.setRoot(t.initTree());


// t.middleOrderTraversal();


//先研究一下 Comparator o1 > o2 的排序逻辑


//testSort();


/* * 10



    */


    // add 方法测试


    BinaryTree<Integer> t = new BinaryTree<Integer>();


    // t.add(new Integer(10));


    // t.add(new Integer(18));


    // t.add(new Integer(3));


    // t.add(new Integer(2));


    // t.add(new Integer(4));


    // t.add(new Integer(8));


    // t.add(new Integer(9));


    // t.add(new Integer(9));


    // t.add(new Integer(21));


    // t.add(new Integer(13));


    t.add(new Integer(10));


    t.add(new Integer(18));


    t.add(new Integer(3));


    t.add(new Integer(9));


    t.add(new Integer(8));


    t.add(new Integer(2));


    t.add(new Integer(21));


    t.add(new Integer(4));


    t.add(new Integer(9));


    t.add(new Integer(13));


    t.add(new Integer(11));


    t.add(new Integer(15));


    //查看数结构,中序遍历


    t.middleOrderTraversal();


    //测试删除


    System.out.println("删除节点 18");


    t.remove(new Integer(18));


    System.err.println("删除节点 18 号的排序二叉树");


    t.middleOrderTraversal();


    System.out.println("测试结束");


    }


    /**


    • 当用升序排序时,则 o1 > o2 时要返回大于 0 的数


    */


    public static void testSort() {


    List<Integer> a = new ArrayList<Integer>();


    a.add(1);


    a.add(8);


    a.add(9);


    a.add(3);


    a.add(5);


    Collections.sort(a, new Comparator<Integer>() {


    @Override


    public int compare(Integer o1, Integer o2) {


    return o1.intValue() > o2.intValue() ? 1 : -1;


    }


    });


    System.out.println(a);


    }


    /**


    • 用来测试的,后续会完善 加入元素


    • @return


    */


    @Deprecated


    public TreeNode<Integer> initTree() {


    TreeNode<Integer> _root = new TreeNode<Integer>(new Integer(10), null); // 根节点

    用户头像

    Java高工P7

    关注

    还未添加个人签名 2021.11.08 加入

    还未添加个人简介

    评论

    发布
    暂无评论
    排序二叉树JAVA版实现