C++ Find Min and Max element in a BST

对于一个二叉搜索树, 要想找到这棵树的最小元素值, 我们只需要从树根开始, 沿着left 孩子指针一直走, 知道遇到NULL(即走到了叶子), 那么这个叶子节点就存储了这棵二叉搜索树的最小元素。 同理, 从根节点开始, 沿着right 孩子指针, 最终找到的是最大关键字的节点。

也就是说寻找BST最小关键字的元素和最大关键字的元素的代码是对称的。伪代码如下:

TREE_MINIMUM(x)

while x.left != NULL

x= x.left

return  x

寻找最大关键字元素的伪代码:

TREE_MAXMUM(x)

while x.right != NULL

x= x.right

return  x

对应的C++ 代代码如下:

树的节点定义如下:

// C style of using struct, in C++ simply below:
/*
struct Node {
	int data;
    Node *left;
    Node *right;
};

*/
struct Node {
	int data;
	struct Node *left;
	struct Node *right;
};

寻找最大值和最小值可以使用递归的方式, 也可以使用迭代的办法(iterative solution), 下面首先给出迭代的解决办法。 对应函数为:

//Function to find minimum in a BST tree.
Node* FindMin(Node* root)
{
	while(root->left != NULL) root = root->left;
	return root;
}

//Function to find maximum in a BST tree.
Node* FindMin(Node* root)
{
	while(root->right != NULL) root = root-> right;
	return root; // okay , this root is local variables
}

注意, 上述找到的只是具有最大值和最小值的元素节点。 如果想返回最大的值, 直接可以修改为如下(也可以在主程序中直接使用返回的节点-> data 即可).。 但是上面的代码还是有点问题的。 设想, 如果我们的BST是empty的, 我们需要 throw some error, 下面给出一个更好的返回值的代码(只给出查找最小元素值并返回的代码):

int FindMin(Node* root)
{
    if(root == NULL) {
       cout << "Error: BST is empty \n";
       return -1;// print error  and return -1
    }
    Node* current = root; // 不用额外什么curret 变量, 也可以直接使用root变量, 因为root是Local variable
	while(current -> left != NULL) {
	   current = current -> left;
	}
	return current -> data;
}

将上面程序改为:

int FindMin(Node* root)
{
    if(root == NULL) {
       cout << "Error: BST is empty \n";
       return -1;// print error  and return -1
    }
    while(root -> left != NULL) {
	   root = root -> left;
	}
	return root -> data;// 注意root 为Local variable
}

上述是使用迭代的办法。 由于树时递归的数据结构, 我们当然可以使用递归的办法查找最大值和最小值。 以查找最小元素为例, 从根节点开始, 查找树的根节点的左子树的最小值, 然后查找下一个节点为根节点的左子树的最小值。。。, 直至遇到了空子树, 返回。 程序如下所示:

int FindMin2(Node* root) {
   if(root == NULL) {
      cout << "Error: Tree is empty\n";
      return -1;
   }
   else if(root -> left == NULL) {
      return root -> data; // base case
   }
   //search the left subtree
   return FindMin(root -> left);
}

C++ Find Min and Max element in a BST

时间: 2024-10-24 18:49:18

C++ Find Min and Max element in a BST的相关文章

5.7.2.2 min()和max()方法

Math对象还包含许多方法,用于辅助完成简单和复杂的数学计算. 其中,min()和max()方法用于确定一组数值中的最小值和最大值.这两个方法都可以接受任意多个数值参数,如下例子: var max = Math.max(3,54,32,16); alert(max);//54 var min = Math.min(3,54,32,16); alert(min);//3 对于3.54.32和16,Math.max()返回54,而Math.min()返回3.这两个方法经常用于避免多余的循环和在if语

3.python小技巧分享-使用min和max函数去找字典中的最大值和最小值

睡前分享一个小技巧- 使用min和max函数来巧妙的查找一个字典中的最大value和最小value. 比如说,现在有一个字典,字典的key是用户名,value则是这个用户的账户有多少钱. 现在想要找出账户内余额最多的用户,请问如何实现? d1 = {'suhaozhi':12345,'tony':4513,'eric':135,'jolin':13000000} 很简单,只要使用zip函数结合max函数就可以做到了. print max(zip(d1.values(),d1.keys())) #

Hive分析窗体函数之SUM,AVG,MIN和MAX

Hive中提供了非常多的分析函数,用于完毕负责的统计分析. 本文先介绍SUM.AVG.MIN.MAX这四个函数. 环境信息: Hive版本号为apache-hive-0.14.0-bin Hadoop版本号为hadoop-2.6.0 Tez版本号为tez-0.7.0 构造数据: P088888888888,2016-02-10,1 P088888888888,2016-02-11,3 P088888888888,2016-02-12,1 P088888888888,2016-02-13,9 P0

numpy中min和max的用法

min和max用法差不多,只写min 的 min返回数组中的最小值 1.若是数据集.min()里面没有写参数,则选择所有数据里面的最小值,因为给的数组可能有多维,但是没指定参数的话,就选一个最小值 2.min(0),选择第一维中的 所有 最小值,比如说是一个数组[1,2],[3,4],最终结果是[1,2]. [1,2]和[3,4]这两个是第一维,就是1和3比较,2和4比较 3.min(1),选择第二维中的最小值,同样是上面的例子,1和2比较,3和4比较,最终结果[1,3]

Min and Max

Min and Max 需要处理不同数据类型; 另外*args, 表示的是位置参数, *kwargs表示的是key参数, args的类型为tuple类型, 参数为min(3, 2)时, args为(3, 2), 参数为min([3, 2])时, args为([3, 2], ); 列表解析为[i for i in range(0, 1)], 而(i for i in range(0, 1))为generator, 通过.next()属性获取下一个元素, 它不像列表解析一次性生成所有元素, 每次调用

Visual C++中min()和max()函数的使用

标准库在<algorithm>头中定义了两个模板函数std::min() 和 std::max().通常用它可以计算某个值对的最小值和最大值. 可 惜在 Visual C++ 无法使用它们,因为没有定义这些函数模板.原因是名字min和max与<windows.h>中传统的min/max宏定义有冲突.为了解决 这个问题,Visual C++ 定义了另外两个功能相同的模板:_cpp_min() 和 _cpp_max().我们可以用它们来代替std::min() 和 std::max()

mysql中min和max查询优化

mysql max() 函数的需扫描where条件过滤后的所有行: 在测试环境中重现: 测试版本:Server version:         5.1.58-log MySQL Community Server (GPL) testtable表中的索引 mysql> show index from testtable;+-----------+------------+------------+--------------+-------------+-----------+---------

java8 stream接口 终端操作 min,max,findFirst,findAny

// 方法一 https://www.cnblogs.com/secbro/p/11685681.html Integer id = list.stream().map(Foo::getId).findAny().orElse(null); // 方法二 Integer id = list.stream().findAny().map(Foo::getId).orElse(-1); 如果删除方法一,只执行方法二,则不会出现异常.为什么呢? 具体分析: 首先方法一种,list.stream().m

[LeetCode][JavaScript]Kth Smallest Element in a BST

Kth Smallest Element in a BST Given a binary search tree, write a function kthSmallest to find the kth smallest element in it. Note: You may assume k is always valid, 1 ≤ k ≤ BST's total elements. Follow up: What if the BST is modified (insert/delete