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

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

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

#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;
}
相关文章
|
6月前
|
存储 算法
【二叉树】数据结构——BST二叉树基本概念及算法设计(插入、删除、遍历操作)
【二叉树】数据结构——BST二叉树基本概念及算法设计(插入、删除、遍历操作)
|
7月前
|
存储
二叉树的基本概念以及基本操作
二叉树的基本概念以及基本操作
128 2
|
存储 算法
【数据结构】二叉树的构建与基本操作实现
【数据结构】二叉树的构建与基本操作实现
230 0
|
C++
构建二叉树
构建二叉树
63 0
构建二叉树
【数据结构】轻松掌握二叉树的基本操作及查找技巧
二叉树的基本操作 ​ 在学习二叉树的基本操作前,需先要创建一棵二叉树,然后才能学习其相关的基本操作。由于现在大家对二 叉树结构掌握还不够深入,为了降低学习成本,此处手动快速创建一棵简单的二叉树,快速进入二叉树操作学习,等二叉树结构了解的差不多时,再来研究二叉树真正的创建方式,下面用左右孩子法来定义二叉树结构体。
|
存储
树和二叉树的基本概念
1.树的概念: a.树是一种非线性的数据结构,它是由n(n&gt;=0)个有限结点组成一个具有层次关系的集合。 b.把它叫做树是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。 c.有一个特殊的结点,称为根结点,根节点没有前驱结点 除根节点外,其余结点被分成M(M&gt;0)个互不相交的集合T1、T2、……、Tm,其中每一个集 合Ti(1&lt;= i &lt;= m)又是一棵结构与树类似的子树。每棵子树的根结点有且只有一个前驱,可以 有0个或多个后继 因此,树是递归定义的。 .
93 0
树和二叉树的基本概念
|
存储 JavaScript
二叉树的基本概念、存储结构和(递归)遍历方式
二叉树的基本概念、存储结构和(递归)遍历方式
二叉树的基本概念、存储结构和(递归)遍历方式
【Java数据结构】实现二叉树及其基本操作
【Java数据结构】实现二叉树及其基本操作
【Java数据结构】实现二叉树及其基本操作
《Java数据结构》二叉树的这些基本操作你真的理解了吗
《Java数据结构》二叉树的这些基本操作你真的理解了吗
|
算法 前端开发
理解和默写 二叉树的基本操作
理解和默写 二叉树的基本操作
103 0