给定一颗二叉查找树,给定一个值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
测试结果:
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步