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

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

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

#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;
}
相关文章
|
5月前
|
存储 算法
【二叉树】数据结构——BST二叉树基本概念及算法设计(插入、删除、遍历操作)
【二叉树】数据结构——BST二叉树基本概念及算法设计(插入、删除、遍历操作)
|
6月前
|
存储
二叉树的基本概念以及基本操作
二叉树的基本概念以及基本操作
76 2
|
5月前
|
算法
数据结构和算法学习记录——初识二叉树(定义、五种基本形态、几种特殊的二叉树、二叉树的重要性质、初识基本操作函数)
数据结构和算法学习记录——初识二叉树(定义、五种基本形态、几种特殊的二叉树、二叉树的重要性质、初识基本操作函数)
54 0
|
存储 算法
【数据结构】二叉树的构建与基本操作实现
【数据结构】二叉树的构建与基本操作实现
219 0
【数据结构】轻松掌握二叉树的基本操作及查找技巧
二叉树的基本操作 ​ 在学习二叉树的基本操作前,需先要创建一棵二叉树,然后才能学习其相关的基本操作。由于现在大家对二 叉树结构掌握还不够深入,为了降低学习成本,此处手动快速创建一棵简单的二叉树,快速进入二叉树操作学习,等二叉树结构了解的差不多时,再来研究二叉树真正的创建方式,下面用左右孩子法来定义二叉树结构体。
|
存储 JavaScript
二叉树的基本概念、存储结构和(递归)遍历方式
二叉树的基本概念、存储结构和(递归)遍历方式
二叉树的基本概念、存储结构和(递归)遍历方式
【Java数据结构】实现二叉树及其基本操作
【Java数据结构】实现二叉树及其基本操作
【Java数据结构】实现二叉树及其基本操作
《Java数据结构》二叉树的这些基本操作你真的理解了吗
《Java数据结构》二叉树的这些基本操作你真的理解了吗
|
算法 前端开发
理解和默写 二叉树的基本操作
理解和默写 二叉树的基本操作
98 0
|
存储 Java Linux
C++ 第八节&数据结构 第七节 ——二叉搜索树 AVL树 红黑树(底层原理图+模拟实现)
每一个关键码key,都有与之对应的值Value,即&lt;Key, Value&gt;的键值对。该种方式在现实生活中非常常见:比如英汉词典就是英文与中文的对应关系,通过英文可以快速找到与其对应的中文,英文单词与其对应的中文&lt;word, chinese&gt;就构成一种键值对;
227 0
C++ 第八节&数据结构 第七节 ——二叉搜索树 AVL树 红黑树(底层原理图+模拟实现)