构建二叉搜索树及基本操作

二叉搜索树具有下列性质: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树。
在二叉搜索树的基础上,如果进行一次中序遍历,则会正好会把节点的权值从小到大搜一遍。

#include <iostream>
#include <cstdio>
#include <cstdlib>
using namespace std;

struct Node{//节点 
	int data;
	Node *left;
	Node *right;
};
struct Tree{//树 
	Node *root;
};

//先序遍历(dfs遍历)
void preorder(Node *node)
{
	if (node!=NULL){
		cout<<node->data<<endl;
		preorder(node->left);
		preorder(node->right);
	}
}


//中序遍历-->正好是从小到大排序 
void inorder(Node *node)
{
	if (node!=NULL){
		inorder(node->left);
		cout<<node->data<<endl;
		inorder(node->right);
	}
} 


//后序遍历
void postorder(Node *node)
{
	if (node!=NULL){
		postorder(node->left);
		postorder(node->right);
		cout<<node->data<<endl;
	}
}


//插入节点
void insert_node(Tree *tree, int value)
{
	Node *node=(Node *)malloc(sizeof(Node));
	node->data=value;
	node->left=NULL;
	node->right=NULL; 
	
	if (tree->root==NULL){
		tree->root=node;
	}else{
		Node *tmp=tree->root;
		while (tmp!=NULL){
			if (value<tmp->data){
				if (tmp->left==NULL){
					tmp->left=node;
					return;
				}else{
					tmp=tmp->left;
				}
			}else{
				if (tmp->right==NULL){
					tmp->right=node;
					return;
				}else{
					tmp=tmp->right;
				}
			}
		}
	}
} 


//求树的高度
int get_height(Node *node)
{
	if (node==NULL){
		return 0;
	}else{
		int left_h=get_height(node->left);
		int right_h=get_height(node->right);
		int max_height=max(left_h, right_h);
		return max_height+1;
	}
}


//最大值
int get_max(Node *node)
{
	if (node==NULL)
		return -1;
	else{
		int max_left=get_max(node->left);
		int max_right=get_max(node->right);
		int max_this=node->data;
		int maxx=max_left;
		if (max_right>maxx)	maxx=max_right;
		if (max_this>maxx)	maxx=max_this;
		return maxx;
	}
} 
int main()
{
	int a[10]={6,3,8,2,5,1,7};
	Tree tree;
	tree.root=NULL;
	for (int i=0; i<=6; i++){
		insert_node(&tree, a[i]);
	}
	preorder(tree.root);
	cout<<endl<<endl;
	int height=get_height(tree.root);
	cout<<height<<endl;
	int maxx=get_max(tree.root);
	cout<<maxx<<endl; 
	return 0;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

H4ppyD0g

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

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

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

打赏作者

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

抵扣说明:

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

余额充值