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