码迷,mamicode.com
首页 > 编程语言 > 详细

java递归方法建立搜索二叉树,具备查找关键字,插入新节点功能

时间:2015-02-09 21:40:31      阅读:338      评论:0      收藏:0      [点我收藏+]

标签:

二叉排序树的定义:

二叉排序树满足以下三个性质(BST性质):

<1>若它的左子树非空,则左子树上所有节点的值均小于根节点的值

<2>若它的右子树非空,则右子树上所有节点的值均大于根节点的值

<3>左,右子树本身又各是一棵二叉排序树

根据二叉排序树的BST性质,可以说二叉排序树每个节点上的值(或称关键字)都是唯一的,并且二叉排序树以中序遍历输出的结果必然是一个有序的递增序列。

如下图所示:

技术分享

用递归方法建立二叉排序树,减少了繁复的比较程序,效率较高。只需要知道每个节点的值,按照递归的方法,首先获取第一个节点的值,然后获取第二个节点的值,将第二个节点与第一个节点进行比较,若小于,则将第二个节点的值放在左子树,若大于,则将第二个节点的值放在右子树,循序渐进,递归每个节点的值,最终建立一棵完整的二叉排序树。

进行二叉排序树查找操作时,传递要查找的值,先与根节点进行比较,若不等于根节点,则根据该查找的值与根节点的大小,递归遍历左子树或者右子树。直到找到该查找值,输出结果。

进行二叉排序树插入操作时,直接将要插入的值用ArrayList链表存入数组,遍历数组,传入新的节点值,继续调用递归方法进行二叉排序树的建立。最终的结果以中序遍历二叉树输出。

代码如下:

package 二叉排序树;

import java.util.ArrayList;
import java.util.Scanner;

public class SortTree {

    
    /**
     * @author 刘雁冰
     * @date 2015-02-09 18:32
     */
    
    /*
     * 具备建立搜索二叉树,查找关键字,以及插入新节点功能
     * 
     * key:关键字,这里可以作为节点的值
     * l:左子树
     * r:右子树
     */
    public int key;    
    public SortTree l;
    public SortTree r;
    
    /*
     * 递归方法建立一棵二叉排序树
     */
    public void bulitTree(int key){
        //新加入来的节点先与根节点的值进行比较,小于根节点放入左子树,大于根节点放入右子树
        if(key<this.key){                        
            if(this.l==null){                    
                this.l=new SortTree();
                this.l.key=key;
            }
            else
                //左子树递归建立二叉树
                this.l.bulitTree(key);
        }
        else if(key>this.key){
            if(this.r==null){
                this.r=new SortTree();
                this.r.key=key;
            }
            else
                //右子树递归建立二叉树
                this.r.bulitTree(key);
        }
    }
    
    /*
     * 递归寻找关键字,若存在关键字返回提示信息
     */
    public void seach(int key){
        //先与根节点进行比较,若不等于根节点,则根据该查找的值与根节点的大小,递归遍历左子树或者右子树
        if(key==this.key)
            System.out.println("找得到当前值:"+this.key);
        else if(key<this.key)
            this.l.seach(key);
        else
            this.r.seach(key);
    }
    
    public void inorder(){
        if(this.l!=null)
            l.inorder();
        System.out.print(this.key+",");
        if(this.r!=null)
            r.inorder();
    }
    
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        System.out.println("输入节点,第一个输入的作为二叉树的根节点(输入-1结束输入):");
        Scanner sc=new Scanner(System.in);
        ArrayList<Integer>list=new ArrayList<Integer>();
        int n=sc.nextInt();
        while(n!=-1){
            list.add(n);
            n=sc.nextInt();
        }
        int []data=new int[(list.size())];
        for(int i=0;i<list.size();i++){
            data[i]=list.get(i);
        }
        
        SortTree st=new SortTree();
        st.key=data[0];
        for(int i=1;i<data.length;i++){
            st.bulitTree(data[i]);
        }
        
        System.out.println("建立的搜索二叉树如下(以中序遍历输出):");
        st.inorder();
        System.out.println();
        System.out.println("输入要进行的操作:");
        System.out.println("1.查找当前值");
        System.out.println("2.插入新的节点");
        int choice=sc.nextInt();
        switch(choice){
        case 1:{
            System.out.println("输入要查找的值:");
            int k=sc.nextInt();
            st.seach(k);
            break;
        }
        case 2:{
            System.out.println("请输入新节点的值(输入-1结束输入):");
            int m=sc.nextInt();
            while(m!=-1){
                list.add(m);
                m=sc.nextInt();
            }
            for(int i=data.length-1;i<list.size();i++){
                st.bulitTree(list.get(i));
            }
            System.out.println("插入新的节点后,二叉搜索树的结果如下(以中序遍历输出):");
            st.inorder();
            break;
        }
        default:{System.out.println("输入有误");}
        }
    }
    
}

 

调试结果如下:

技术分享

技术分享

java递归方法建立搜索二叉树,具备查找关键字,插入新节点功能

标签:

原文地址:http://www.cnblogs.com/luckid/p/4282449.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!