链表和二叉查找树

《算法》第四版的源代码:    http://algs4.cs.princeton.edu/code/  ,看了看还是很有收获!

相同点:

1、链表 :Node包括(value (不一定存什么类型!!!), next , N(可以添加一个参数))  二叉查找树 Node(value(一个键值对,key负责节点的操作,value负责节点存储的信息) , right , left ,N(以该根节点的子节点的节点的个数))

2、链表(必要元素 head):入口是head,每当我们要操作链表的时候,都要保证新链表的head的正确性;

 二叉树(必要元素 root):入口是root,二叉树也一样,时刻也要保证是否还是原来的root;而且什么参数都要和root进行比较;

3、为什么使用二叉查找树: 集二分查找和链表的优点于一身!

4、二分查找:

//迭代思想的 二分查找  ,先排序,后查找
    public int rank(Key key){
        int lo = 0;
        int hi = N-1;
        while(lo<hi){
        int mid = (lo + hi) / 2;
        //这里的compareTo对任意扩展于comparable的类都能做比较!!!
        int cmp = key.compareTo(key[mid]);
        if(cmp == 0) return mid;
        if(cmp < 0) hi = mid - 1;
        if(cmp > 0) lo = mid + 1;
        }
        return lo;
    }

5、对链表的操作:

    1、设置快慢指针(一个先走,一个等等); 

    2、设置两个同步指针(只是两个指针的步子不同,一个一次一步,一个一次两步);

    3、声明一个新的节点。将即将要被操作的节点存到里面,操作完以后再为下一次做准备;

//特别是要对某个节点做操作时,因为两个节点之间是有联系的!后面的节点还要用到节点变化之前的关系。

  对树的操作:递归,中序遍历;

//我们调用detele时,都是调用下面这个方法,但是这个方法并没有返回值,因此不能利用递归去操作节点;所以我们可以重载一个私有方法,来封装这个操作的逻辑,调用的时候,有专门的方法去负责调用即可;

//有返回值,这样递归更简单!!

public void delete(Key key){
        root = delete(root , key);
    }

//始终都是操作root

//要理解递归的含义!

private Node delete(Node x , Key key){
        if(x == null) return null;
        //先找key
        int cmp = key.compareTo(x.key);
       if(cmp > 0) x.right = delete(x.right , key);  //这个地方要注意,递归是一个栈,括号里的x和外面的x是不同的,相当于外面的x是栈上一层的x!!
        if(cmp < 0) x.left = delete(x.left , key);
        else if {
         //找到后,判断其左右的两个子节点
            Node t = x;    //这里new一个新的节点,存储要被删除的x的信息!!!!来代表原来的x
        if(x.right == null) return x.left; //这一步展示出来断开;这一步,说明将x的左节点连到x的上层,以代替x的位置;
        if(x.left == null) return x.right;
        //如果两个子节点都不为空!
        x = min(t.right);
        x.right = t.right ;
        x.left = t.left;
        }
      x.N = size(x.left) + size(x.right) +1;
      return x;
    }

题外:

1、对某个类(extends comparable 这个接口,利用(重写)其中的compareTo方法,找到这个类的两个对象的比较原则,返回0,-1,1)

2、然后对这些个对象(一般存在数组或集合中),利用sort()方法,将这些个对象进行排序;

3、排好序,就可以导入相应的查找效率较高的数据结构;

4、在这些个数据结构中,利用其提供的方法,进行操作;

疑问:

1、普通二叉树,怎么转换到二叉查找树,,,(或许,怎么把排好序的数组 -> 二叉查找树? 中序遍历)

时间: 2024-11-18 10:19:58

链表和二叉查找树的相关文章

用二叉链表实现二叉查找树(二)

/* 二叉查找树的链表实现: 以及三种遍历方式,删除节点: 查找节点: author:天下无双 Date:2014-5-28 Version:3.0 */ #include <iostream> #include <string> typedef int T;//树内节点的数据类型 using namespace std; class BiTree { private: struct BiNode{ T data; BiNode *lchild,*rchild; BiNode(T

二叉查找树(binary search tree)详解

二叉查找树(Binary Search Tree),也称二叉排序树(binary sorted tree),是指一棵空树或者具有下列性质的二叉树: 若任意节点的左子树不空,则左子树上所有结点的值均小于它的根结点的值 任意节点的右子树不空,则右子树上所有结点的值均大于它的根结点的值 任意节点的左.右子树也分别为二叉查找树 没有键值相等的节点(no duplicate nodes) 本文地址:http://www.cnblogs.com/archimedes/p/binary-search-tree

《数据结构复习笔记》--二叉搜索树

二叉搜索树:维基百科:click here 二叉查找树(Binary Search Tree),也称二叉搜索树.有序二叉树(ordered binary tree),排序二叉树(sorted binary tree),是指一棵空树或者具有下列性质的二叉树: 若任意节点的左子树不空,则左子树上所有结点的值均小于或等于它的根结点的值: 任意节点的右子树不空,则右子树上所有结点的值均大于它的根结点的值: 任意节点的左.右子树也分别为二叉查找树. 没有键值相等的节点(no duplicate nodes

Hashmap in java

1. HashMap要点: 1.1 基本数据结构:  采用 数组+链表/平衡二叉查找树 的组合形式,所有键值对都以Entry<K,V>形式存储(每put进一个键值对,就会实例化一个Entry<K, V>). 数组:Entry<K,V>数组,以hash( key.hashCode() ) 为数组索引.即计算键值的hash值,以此为索引存储键值对Entry<K, V>.数组长度总是2的n次方(这与hash有关,后边会讲) 链表:如果hash()方法算出的hash

leetcode dfs Convert Sorted List to Binary Search Tree

Convert Sorted List to Binary Search Tree Total Accepted: 21420 Total Submissions: 78476My Submissions Given a singly linked list where elements are sorted in ascending order, convert it to a height balanced BST. 题意:把有序单链表转换为二叉查找树 思路: 用链表中心作为当作二叉树的根,

[leetcode]Convert Sorted List to Binary Search Tree @ Python

原题地址:http://oj.leetcode.com/problems/convert-sorted-list-to-binary-search-tree/ 题意:将一条排序好的链表转换为二叉查找树,二叉查找树需要平衡. 解题思路:两个思路:一,可以使用快慢指针来找到中间的那个节点,然后将这个节点作为树根,并分别递归这个节点左右两边的链表产生左右子树,这样的好处是不需要使用额外的空间,坏处是代码不够整洁.二,将排序好的链表的每个节点的值存入一个数组中,这样就和http://www.cnblog

2017校招常考算法题归纳&amp;典型题目汇总

2017校招即将来临,我们为大家整理了2017校招的常考算法类型,以及对应的典型题目. 另附参考答案地址:http://www.jiuzhang.com/solution/ 数学 尾部的零 斐波纳契数列 x的平方根 x的平方根 2 大整数乘法 骰子求和 最多有多少个点在一条直线上 超级丑数 比特位操作 将整数A转换为B 更新二进制位 二进制表示 O(1)时间检测2的幂次 二进制中有多少个1 动态规划 编辑距离 正则表达式匹配 交叉字符串 乘积最大子序列 二叉树中的最大路径和 不同的路径 通配符匹

优先队列(堆)

优先队列(priority queue)是允许至少两种操作的数据结构:Insert及DeleteMin(删除最小者).相当于队列中的Enqueue.Dequeue操作. 优先队列可以用链表.二叉查找树.二叉堆等实现. 二叉堆 1. 结构性质 堆(heap)是一棵完全被填满的二叉树,有可能的例外是在底层,底层上的元素从左向右填入.这样的树称之为完全二叉树. 一棵高为h的完全二叉树有2h到2h+1-1个节点.完全二叉树的高为logN. 完全二叉树可以用数组来表示,如果从0开始,对于数组中任意i位置的

校招的常考算法类型以及对应的典型题目

数学 尾部的零斐波纳契数列x的平方根x的平方根2大整数乘法骰子求和最多有多少个点在一条直线上超级丑数 比特位操作 将整数A转换为B更新二进制位二进制表示O(1)时间检测2的幂次二进制中有多少个1 动态规划 编辑距离正则表达式匹配交叉字符串乘积最大子序列二叉树中的最大路径和不同的路径通配符匹配 堆 滑动窗口的中位数数据流中位数最高频的K个单词接雨水堆化排序矩阵中的从小到大第k个数 二叉树 二叉树中序遍历二叉树的序列化和反序列化子树最近公共祖先二叉树的层次遍历将二叉树拆成链表在二叉查找树中插入节点