数据结构(java)---二叉搜索树

先介绍一下什么是二叉树

       二叉树是一种特殊的顺序树,它规定有左右两个孩子,即左右孩子顺序不能替换,所以二叉树是一种有序树。二叉树的结点数为大于0小于等于2。

     例如这样的树:

       再说什么是二叉搜索树

                1,若根节点有左子树,则左子树的所有节点都比根节点小; 
                2,若根节点有右子树,则右子树的所有节点都比根节点大; 
                3,根节点的左,右子树也分别为二叉排序树.

        满足这三个性质的树就是二叉搜索树也叫二叉查找树。

    例如这样的树:

       

       二叉树的遍历:

        1,前序遍历:

            若树为空,不进行任何操作 
            (1) 访问树的根节点  
            (2) 前序遍历左子树
            (3) 前序遍历右子树 

      2,中序遍历:

            若树为空,不进行任何操作 
          (1) 中序遍历左子树 
          (2) 访问树的根节点 
          (3) 中序遍历右子树 

      3,后序遍历:

             若树为空,不进行任何操作     
             (1) 前序遍历左子树 
             (2) 后序遍历左子树 
             (3) 访问树的根节点 

            具体代码如下:

import java.util.ArrayList;
import java.util.List;

public class 二叉树 {
//    定义左节点
    public 二叉树 leftnode;
//    定义右节点
    public 二叉树 rightnode;
//    每个节点的值
    public Integer value;

//    二叉树的插入
    public void add(Integer v){
//        当前节点值为空时插入
        if (value ==null){
            value = v;
        }else {
//            如果当前节点有值,则判断,新增的值大于当前值,添加到右子树,新增的值小于当前值,添加到左子树。
          if (v<value){
//              如果左子树为空则新建左子树节点
              if (leftnode ==null){
                  leftnode = new 二叉树 ();
              }
              leftnode.add ( v );
          }else {
              //              如果右子树为空则新建右子树节点
               if (rightnode ==null){
                   rightnode = new 二叉树 ();
               }
               rightnode.add ( v );

          }
        }
    }
    //        二叉树的前序遍历
    public List<Integer> FbianliRel(){
        List<Integer> list = new ArrayList <> (  );
        //当前节点
        list.add ( value );
        //遍历左节点
        if (leftnode!=null){
            list.addAll ( leftnode.FbianliRel () );
        }
        //遍历右节点
        if (rightnode!=null){
            list.addAll ( rightnode.FbianliRel () );
        }
        return list;
    }
    //        二叉树的中序遍历
    public List<Integer> MbianliRel(){
        List<Integer> list = new ArrayList <> (  );
        //遍历左节点
        if (leftnode!=null){
            list.addAll ( leftnode.MbianliRel () );
        }
        //当前节点
        list.add ( value );
        //遍历右节点
        if (rightnode!=null){
            list.addAll ( rightnode.MbianliRel () );
        }
        return list;
    }
    //        二叉树的后序遍历
    public List<Integer> LbianliRel(){
        List<Integer> list = new ArrayList <> (  );

        //遍历左节点
        if (leftnode!=null){
            list.addAll ( leftnode.LbianliRel () );
        }
        //遍历右节点
        if (rightnode!=null){
            list.addAll ( rightnode.LbianliRel () );
        }
        //当前节点
        list.add ( value );
        return list;
    }
    public static void main(String[] args){
//        声明根节点
        二叉树 rootnode = new 二叉树 ();
//        随机数组
        int [] nums = new int[]{13,7,15,3,11};
//        遍历(用到了增强的foe循环能比一般foe循环简便点。)
        for (int num:nums){
            rootnode.add ( num );
        }
        //前序遍历
        System.out.println("前序遍历:"+rootnode.FbianliRel ());
       //中序遍历
        System.out.println("中序遍历:"+rootnode.MbianliRel ());
        //后序遍历
        System.out.println("后序遍历:"+rootnode.LbianliRel ());
    }
}

执行结果:

 

   总结:二叉搜索树是很重要的数据结构,它有个特点就是二叉搜索树的中序遍历就是按照从小到大排序的数组(列表),

而且效果比冒泡排序和选择排序都要快,(它的查找也很迅速,类似2分查找)。值得我去花时间理解掌握。

  2019-2-26

发布了43 篇原创文章 · 获赞 6 · 访问量 6680

猜你喜欢

转载自blog.csdn.net/weixin_37850160/article/details/87946349