Tree

来源:互联网 发布:c语言void 的用法 编辑:程序博客网 时间:2024/06/14 11:23

1.BinaryTree(二分树)

(1)每个节点

  • A value
  • A parent
  • A left child
  • A right child

(2)traversal(遍历)

  • 前序遍历
  • 中序遍历
  • 后序遍历
  • (levelOrder)层遍历
              利用 Queue 接口实现 FIFO (先进先出)遍历。
private void LevelOrder(TreeNode<E> root){Queue<TreeNode<E>> q = new LinkedList<TreeNode<E>>();q.add(root);while((!q.isEmpty())){TreeNode<E> curr = q.remove();if(curr != null){System.out.println(curr.key);q.add(curr.leftChild);q.add(curr.rightChild);}}}


(3) contains

private boolean Contains(E toFind){TreeNode<E> curr = root;int comp;while(curr != null){comp = curr.compareTo(toFind);if(comp < 0)curr = curr.rightChild;else if(comp > 0)curr = curr.leftChild;elsereturn true;}return flase;}
注意:此处使用方法 compareTo() 需要在类中实现 Comparable 接口。( <E extends Comparable<? super E>>)



(4)Insert

public boolean insert(E toInsert){TreeNode<E> curr = root;int comp = toInsert.compareTo(curr.getData());while(comp < 0 && curr.getLeft() != null || comp > 0 && curr.getRight() != null){if(comp < 0)curr = curr.getLeft();elsecurr = curr.getRight();        comp = toInsert.compareTo(curr.getData());}if(comp < 0)curr.setLeftChild(toInsert, curr);else if(comp > 0)curr.setRightChild(toInsert, curr);elsereturn false;return true;}


(5)remove

private BinaryNode<AnyType> remove(AnyType x,BinaryNode<AnyType> t){if(t == null)return t; // 若没有找到,do nothingint compareResult = x.compareTo(t.element);if(compareResult < 0)t.left = remove(x,t.left);else if(compareResult > 0)t.right = remove(x,t.right);else if(t.left != null && t.right != null){ // 双儿子情况t.element = finMin(t.right).element; // 把右子树最小值提上,代替删除点t.right = remove(t.element,t.right); // 对右子树上的最小值进行删除}elset = (t.left != null) ? t.left : t.right; // 一儿子或无儿子,删除原点后指向其儿子或null值return t;}

注:此 remove 操作一直寻找右子树最小值进行替换,容易使 树 出现“”左沉“”现象。



2.AVL树










0 0
原创粉丝点击