树算法专题二叉查找树

Posted bijian

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了树算法专题二叉查找树相关的知识,希望对你有一定的参考价值。

一、基本操作

1、查找

技术图片

2、插入

技术图片

技术图片

3、建立

技术图片

4、删除

技术图片

技术图片

二、问题

技术图片

技术图片

7
8 6 5 7 10 8 11
7
8 10 11 8 6 7 5
7
8 6 8 5 10 9 11

测试代码:

     //0
        cout<<"origin:";
        for(int i=0;i<(int)origin.size();i++){
            cout<<origin[i]<<" ";
        }
        cout<<endl;
        //1
        cout<<"pre:";
        for(int i=0;i<(int)pre.size();i++){
            cout<<pre[i]<<" ";
        }
        cout<<endl;
        //2
        cout<<"prem:";
        for(int i=0;i<(int)prem.size();i++){
            cout<<prem[i]<<" ";
        }
        cout<<endl;
        //3
        cout<<"post:";
        for(int i=0;i<(int)post.size();i++){
            cout<<post[i]<<" ";
        }
        cout<<endl;
        //4
        cout<<"postm:";
        for(int i=0;i<(int)postm.size();i++){
            cout<<postm[i]<<" ";
        }
        cout<<endl;

代码:

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cmath>
#include <vector>
using namespace std;
struct node{
    int data;
    node *left,*right;
};
void insert(node* &root,int data);
void preorder(node* root,vector<int>&vi);
void preorderm(node* root,vector<int>&vi);
void postorder(node* root,vector<int>&vi);
void postorderm(node* root,vector<int>&vi);
int main(){ 
    int n,dt;
    while(cin>>n){
        node *root = NULL;
        vector<int> origin,pre,post,prem,postm;
        for(int i=0;i<n;i++){
            cin>>dt;
            origin.push_back(dt);
            insert(root,dt);
        }
        preorder(root,pre);
        preorderm(root,prem);
        postorder(root,post);
        postorderm(root,postm);
        if(origin==pre){
            cout<<"YES"<<endl;
            for(int i=0;i<(int)post.size();i++){
                cout<<post[i]<<" ";
            }
            cout<<endl;
        }else if(origin==prem){
            cout<<"YES"<<endl;
            for(int i=0;i<(int)postm.size();i++){
                cout<<postm[i]<<" ";
            }
            cout<<endl;
        }else{
            cout<<"NO"<<endl;
        }
    }   
    return 0;
}

void insert(node* &root,int data){
    if(root==NULL){
        root = new node;
        root->data = data;
        root->left=root->right=NULL;
        return;
    }
    if(data<root->data){
        insert(root->left,data);
    }else{
        insert(root->right,data);
    }
}

void preorder(node* root,vector<int>&vi){//先序遍历,结果存在vi
    if(root==NULL){
        return;
    }
    vi.push_back(root->data);
    preorder(root->left,vi);
    preorder(root->right,vi);
}

void preorderm(node* root,vector<int>&vi){//镜像先序遍历,结果存在vi
    if(root==NULL){
        return;
    }
    vi.push_back(root->data);
    preorderm(root->right,vi);
    preorderm(root->left,vi);
}

void postorder(node* root,vector<int>&vi){//后序遍历,结果存在vi
    if(root==NULL){
        return;
    }
    postorder(root->left,vi);
    postorder(root->right,vi);
    vi.push_back(root->data);
}

void postorderm(node* root,vector<int>&vi){//镜像后序遍历,结果存在vi
    if(root==NULL){
        return;
    } 
    postorderm(root->right,vi);
    postorderm(root->left,vi);
    vi.push_back(root->data);
}

 

以上是关于树算法专题二叉查找树的主要内容,如果未能解决你的问题,请参考以下文章

[算法]死磕二叉树专题算法

《寒假算法集训》(专题十六)二叉搜索树

每日算法题 | 剑指offer 二叉树专题 (16) 平衡二叉树

二叉排序树的定义及基本操作(构造查找插入删除)递归及非递归算法

二叉查找树

数据结构中,怎么写二叉树查找双亲的伪代码?急!