二叉搜索树

#include<bits/stdc++.h>
#define INF 0x3f3f3f3f3f3f3f3f
#define mod 1000000007
#define IOS ios::sync_with_stdio(false)
#define endl '\n'
using namespace std;
typedef long long ll;
const int maxn = 1e5 + 10;
typedef struct node {
	int data;
	struct node* left, * right;
}Node;
typedef struct {
	node* root;
}Tree;
int get_height(Node* node) {//求层数
	if (node == NULL)return 0;//如果树为空 返回0
	else {
		int left_h = get_height(node->left);//查找左子树的深度
		int right_h = get_height(node->right);//查找右子树的深度
		int maxn = max(left_h, right_h);//取最大值
		return maxn + 1;//答案为左右子树层数最大值加根节点
	}
}
int get_maximum(Node* node) {//一般树求最大值(若为二叉搜索树,则只需递归搜索右子树)
	if (node == NULL)return -1;//如果树为空 返回-1
	else {
		int left_max = get_maximum(node->left);//查找左子树最大值
		int right_max = get_maximum(node->right);//查找右子树最大值
		int now = node->data;//根节点值
		int maxn = max(now, max(left_max, right_max));//求三者的最大值
		return maxn;
	}
}
void insert(Tree * tree, int val) {
	Node* node = new Node;//申请内存
	node->data = val;//建立一个独立节点并初始化
	node->left = NULL;
	node->right = NULL;
	if (tree->root == NULL) {//如果树为空 则该节点为树根
		tree->root = node;
	}
	else {
		Node* temp = tree->root;//临时变量代表树的根
		while (temp != NULL) {//节点不为空则往下搜索
			if (val < temp->data) {//如果要插入的节点数据比当前节点小
				if (temp->left == NULL) {//查找它的左子树
					temp->left = node;//若为空则把待插入节点放在此位置
					return;
				}
				else temp = temp->left;//否则继续向左搜索
			}
			else {//如果要插入的节点数据比当前节点大
				if (temp->right == NULL) {//查找它的右子树
					temp->right = node;//若为空则把待插入节点放在此位置
					return;
				}
				else temp = temp->right;//否则继续向右搜索
			}
		}
	}
}
int main() {
	int arr[7] = { 6,3,8,2,5,1,7 };
	Tree tree;//初始化一棵树
	tree.root = NULL;//不要忘记将树根初始话为NULL
	for (int i = 0;i < 7;++i) {
		insert(&tree, arr[i]);
	}
	cout << get_height(tree.root) << endl;
	cout << get_maximum(tree.root) << endl;
	return 0;
}

层数

4

最大值

8

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zzqwtc

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值