二叉查找树相关算法

中序遍历

INORDER-TREE-WALK(x)
if x != NIL
     INORDER-TREE-WALK(x.left)
     print x.key
     INORDER-TREE-WALK(x.right)

查找

TREE-SEARCH(x,k)
if x == NIL or k == x.key
        return x
if k < x.key
        return TREE-SEARCH(x.left, k)
else return TREE-SEARCH(x.right, k)

最大关键字

TREE-MAXIMUM(x)
while(x.right != NIL)
      x = x.right
return x

最小关键字

TREE-MINIMUM(x)
while(x.left != NIL)
      x = x.left
return x

后继

TREE-SUCCESSOR(x)
if x.right != NIL
      return TREE-MINIMUM(x.right)
y = x.p
while y != NIL and x == y.right
      x = y
      y = y.p
return y

插入

TREE-INSERT(T, z)
y = NIL
x = T.root
while (x != NIL)
     y = x
     if(z.key < x.key)
        x = x.left
     else(x = x.right)
z.p = y
if(y == NIL)
   T.root  = z    // tree T was empty
else if(z.key < y.key)
   y.left = z
else 
   y.right = z

删除

TREE-DELETE(T, z)
if left[z] = NIL or right[z] = NIL
   then y = z;
   else y = TREE-SUCCESSOR(z)
if left[y] != NIL
   then x = left[y]
   else x = right[y]
if x!=NIL
   then p[x] = p[y]
if p[y] == NIL
   then root[T] = x
   else if y = left[p[y]]
           then left[p[y]] = x
   else right[p[y]] = x
if y != z
   then key[z] = key[y]
return y

实现

构造二叉树结构

    public class BinarySearchTree<E>
    {
        private TreeNode<E> root = new TreeNode<E>(null, null, null, null);
        
        public BinarySearchTree(E root)
        {
            this.root = new TreeNode<E>(root);
        }
    } 
    
    public class TreeNode<T>
    {
        TreeNode<T> parent;
        
        TreeNode<T> leftChild;
        
        T value;
        
        TreeNode<T> rightChild;
        
        public TreeNode(T value)
        {
            this.value = value;
        }
        
        public TreeNode(TreeNode<T> parent, TreeNode<T> leftChild, T element, TreeNode<T> rightChild)
        {
            this.parent = parent;
            this.leftChild = leftChild;
            this.value = element;
            this.rightChild = rightChild;
        }
    }

方法

    public void insert(BinarySearchTree<Integer> bt, Integer value)
    {
        TreeNode<Integer> element = new TreeNode<Integer>(value);
        element.leftChild = element.rightChild = null;
        TreeNode<Integer> x = bt.root;
        TreeNode<Integer> y = null;
        while (x != null)
        {
            y = x;
            if (element.value < x.value)
            {
                x = x.leftChild;
            }
            else
            {
                x = x.rightChild;
            }
        }
        element.parent = y;
        if (y == null)
        {
            bt.root = element;
        }
        else if (element.value < y.value)
        {
            y.leftChild = element;
        }
        else
        {
            y.rightChild = element;
        }
    }
    
    public void delete(BinarySearchTree<Integer> bt, TreeNode<Integer> node)
    {
        TreeNode<Integer> x = null;
        TreeNode<Integer> y = null;
        if (node.leftChild == null || node.rightChild == null)
        {
            y = node;
        }
        else
        {
            y = getSuccessor(node);
        }
        if (y.leftChild == null)
        {
            x = y.leftChild;
        }
        else
        {
            x = y.rightChild;
        }
        if (x != null)
        {
            x.parent = y.parent;
        }
        if (y.parent == null)
        {
            bt.root = x;
        }
        else if (y == y.parent.leftChild)
        {
            y.parent.leftChild = x;
        }
        else
        {
            y.parent.rightChild = x;
        }
        if (y != node)
        {
            node.value = y.value;
        }
    }
    
    //后继
    public TreeNode<Integer> getSuccessor(TreeNode<Integer> node)
    {
        if (node.rightChild != null)
        {
            return getMinNode(node.rightChild);
        }
        TreeNode<Integer> y = node.parent;
        while (y != null && node == y.rightChild)
        {
            node = y;
            y = y.parent;
        }
        return y;
    }
    //前驱
    public TreeNode<Integer> getPredecessor(TreeNode<Integer> node)
    {
        if (node.leftChild != null)
        {
            return getMaxNode(node.leftChild);
        }
        TreeNode<Integer> y = node.parent;
        while (y != null && node == y.leftChild)
        {
            node = y;
            y = y.parent;
        }
        return y;
    }
    
    public TreeNode<Integer> getMinNode(TreeNode<Integer> root)
    {
        TreeNode<Integer> node = root;
        while (node.leftChild != null)
        {
            node = node.leftChild;
        }
        return node;
    }
    
    public TreeNode<Integer> getMaxNode(TreeNode<Integer> root)
    {
        TreeNode<Integer> node = root;
        while (node.rightChild != null)
        {
            node = node.rightChild;
        }
        return node;
    }
    //中序遍历
    public void inOrderTreeWalk(TreeNode<Integer> root)
    {
        if (root != null)
        {
            inOrderTreeWalk(root.leftChild);
            System.out.print(root.value + " ");
            inOrderTreeWalk(root.rightChild);
        }
    }
    //前序遍历
    public void preOrderTreeWalk(TreeNode<Integer> root)
    {
        if (root != null)
        {
            System.out.print(root.value + " ");
            preOrderTreeWalk(root.leftChild);
            preOrderTreeWalk(root.rightChild);
        }
    }
    //后续遍历
    public void postOrderTreeWalk(TreeNode<Integer> root)
    {
        if (root != null)
        {
            postOrderTreeWalk(root.leftChild);
            postOrderTreeWalk(root.rightChild);
            System.out.print(root.value + " ");
        }
    }
    
    public TreeNode<Integer> search(TreeNode<Integer> root, Integer k)
    {
        if (root == null || k.intValue() == root.value)
        {
            return root;
        }
        if (k < root.value)
        {
            return search(root.leftChild, k);
        }
        else
        {
            return search(root.rightChild, k);
        }
    }
    
    public BinarySearchTree<Integer> createBinarySearchTree(int[] a)
    {
        BinarySearchTree<Integer> bt = null;
        for (int i = 0; i < a.length; i++)
        {
            if (i == 0)
            {
                bt = new BinarySearchTree<Integer>(a[0]);
            }
            else
            {
                insert(bt, a[i]);
            }
        }
        return bt;
    }
posted @ 2012-05-28 20:32  qiangzhu  阅读(220)  评论(0编辑  收藏  举报