posts - 61,comments - 5,views - 11万

给定一颗二叉查找树,给定一个值value,求该二叉查找树中不小于某个值value的最小数值。

思考:二叉查找树的特征就是左子节点比父节点值小,右子节点比父节点值大。在获得该二叉查找树根节点的情况下,想要得到该二叉查找树中不小于某个值得最小数值,分以下几点考虑:

1.如果currentNode.getData() == value , 则currentNode节点即为所求节点。

2.如果currentNode.getData() < value , 则当前节点的左子树所有节点的值均小于value, 所

以不需要在左子树中考虑,将搜索范围缩小在右子树中查找。

3.如果currentNode.getData() > value , 则将搜索范围缩小在当前节点和其左子树中查找。更细点讲,如果当前节点的左子树中最大节点值小于value,那么当前节点即为所求,如果当前节点的左子树中最大节点值不小于value,那么将搜索范围缩小在左子树中。

所以,我们采用递归来实现。

节点类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
public class Node {
    int data;
    Node left;
    Node right;
    public Node(){}
    public Node(int data)
    {
        this.data=data;
        left=null;
        right=null;
    }
    public int getData() {
        return data;
    }
    public void setData(int data) {
        this.data = data;
    }
    public Node getLeft() {
        return left;
    }
    public void setLeft(Node left) {
        this.left = left;
    }
    public Node getRight() {
        return right;
    }
    public void setRight(Node right) {
        this.right = right;
    }
     
}

  搜索树类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
public class SearchTree {
    Node root;
     
    public Node createTree()
    {
        Scanner scan=new Scanner(System.in);
    
        int number=scan.nextInt();
        if(number==0)
        {
            return null;
        }
        Node node=new Node(number);
  
        node.setLeft(createTree());
        node.setRight(createTree());
         
        root=node;
        return node;
    }
     
    public Node findTree(Node root, int value)
    {
        if(root==null)
        {
            return null;
        }
        Node iter=root;
        if(iter.data<value)
        {
            return findTree(iter.right,value);
        }
        else if(iter.data==value)
        {
            return iter;
        }
        else if(iter.data>value)
        {
            if(iter.left!=null)
            {
                int leftTreeMax=maxNode(iter.left);
                if(leftTreeMax>=value)
                {
                    return findTree(iter.left,value);
                }
                else
                {
                    return iter;
                }
            }
            else
            {
                return iter;
            }
        }
        return null;
    }
     
    public int maxNode(Node root)
    {
        Node iter=root;
        if(iter!=null)
        {
            while(iter!=null && iter.right!=null)
            {
                iter=iter.right;
            }
            return iter.getData();
        }
        else
        {
            return 0;
        }
    }
 
    public Node getRoot() {
        return root;
    }
 
    public void setRoot() {
        this.root = createTree();
    }
     
     
}

  测试类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class Test {
    public static void main(String [] args)
    {
        SearchTree searchTree=new SearchTree();
        Node root=searchTree.createTree();
        //System.out.println("success");
        int value=98;
        System.out.println(">="+value+":  "+searchTree.findTree(root, value).getData());
         
        value=99;
        System.out.println(">="+value+":  "+searchTree.findTree(root, value).getData());
         
        value=106;
        System.out.println(">="+value+":  "+searchTree.findTree(root, value).getData());
         
        value=108;
        System.out.println(">="+value+":  "+searchTree.findTree(root, value).getData());
         
        value=115;
        System.out.println(">="+value+":  "+searchTree.findTree(root, value).getData());
    }
}

输入:100 90 70 60 0 0 85 0 0 95 92 0 0 98 0 0 110 105 0 107 0 0 125 0 0

测试结果:

posted on   吉大依恋  阅读(430)  评论(0编辑  收藏  举报
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示