数据结构学习笔记4.1--查找节点

有序数组的优点:

在有序数组中查找数据可以用二分查找法,用这个方法在查找时效率很高,所需时间是0(logN),

然而在插入或者删除数据时,需要平均移动N/2项数据,如果需要做很多的插入删除操作,就不应该用有序数组。

 

链表的优点:

链表在插入或者删除时,操作很快,只需要修改对前一个节点的引用,修改后一个节点的引用,就能完成,所需时间复杂度为O(1),

但是在查找数据是,需要链表头开始,平局需要移动N/2个数据,如果需要做很多查找操作,就不应该用到链表。

 

树是一种能将有序数组和链表优点结合使用的数据结构,这里首先研究二叉树,每个节点最多只有两个子节点,这里假设对二叉树的概念都很清楚。

 

查找二叉树节点。根据二叉树的特点,左子节点值总比父节点的小,右子节点的值总比父节点大。

因此,当查找值小于节点值,应该向左子树查找;当查找值大于节点值,应该向右子树查找。

 

图解:假设需要查找57,则查找路线如下图。

image

 

查找代码:

    /**

     * 查找节点

     * 

     * @param key 输入key值

     * @return 返回节点值

     */

    public Node find(int key)

    {

        // 当前节点,相当于一个指针,引用会随着查找变化

        Node current = root;



        // 遍历查询节点

        // 查找方法:根据二叉树的特点,左子节点值总是比父节点值小,右子节点值总比父节点值大

        while (current.iData != key)

        {

            // 比较当前节点值,

            if (key < current.iData)

            {

                // 如果值小于key,则将当前节点current引用变化为左子节点,此时不用判断引用是否为null

                current = current.leftChild;

            }

            else

            {

                // 如果值大于key,则将当前节点current引用变化为右子节点,此时不用判断引用是否为null

                current = current.rightChild;

            }



            // 如果当前节点为空,则表示无法找到key对应的节点

            if (current == null) { return null; }

        }



        return current;

    }

1.这个过程用变量current来表示当前节点(相当于指针),参照key值为要查找的值,因为查找使用root开始的,而且也只知道root的值,所以一开始把root的引用赋值给current。

2.查找过程中,按照二叉树的特点,通过key < current.iData判断是找左子节点,还是右子节点。

3.如果找到,返回current值;否则,返回null。

 

可以这样理解,方便记忆:

经过while循环后,每一次循环结束后,current值就变为key所在子树的根(其实是引用变化),看成是一颗新的树。

 

树的效率:

因为只有在每一层的某一个节点比较(可能是左子节点,也可能是右子节点),所有比较的次数取决于二叉树的层数,所以查找的时间复杂度为O(logN).

你可能感兴趣的:(数据结构)