zoukankan      html  css  js  c++  java
  • 二叉查找树相关算法

    中序遍历

    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;
        }
  • 相关阅读:
    2012年的结束
    学习嵌入式的点滴(一)
    面试的点滴(一)
    学习嵌入式的点滴(二)
    DB2 SQL脚本批量执行(转)
    联邦数据库的一个例子(转)
    在 DB2 9.7 for Linux, UNIX, and Windows 上运行 Oracle 应用程序(转)
    WINDOWS批处理命令详解(转)
    SQL1159 Initialization error with DB2 .NET Data Provider, reason code 2;reason code 10
    Oracle Package中的包变量的使用(转)
  • 原文地址:https://www.cnblogs.com/zhuqiang/p/2522413.html
Copyright © 2011-2022 走看看