1. 程式人生 > >二叉樹-詳解二叉排序樹

二叉樹-詳解二叉排序樹

二叉搜尋樹

首先二叉排序樹也是一棵二叉樹,所謂二叉樹,就是“任何節點最多隻允許兩個子節點”,這兩個子節點稱為左右子節點。如下便是一個二叉樹。 


這裡寫圖片描述 

1、二叉排序樹性質:

1、就是若它的左子樹不空,則左子樹上所有節點的值均小於它的根節點的值; 
2、若它的右子樹不空,則右子樹上所有節點的值均大於其根節點的值。 
3、換句話說就是:任何節點的鍵值一定大於其左子樹中的每一個節點的鍵值,並小於其右子樹中的每一個節點的鍵值。 
如下便是一顆二叉排序樹: 


這裡寫圖片描述

#include<bits/stdc++.h>
using namespace std;
typedef struct tree
{
    int data;
    tree *lc,*rc;
}*bitree;
void create(bitree &root,int n)
{
    if(!root)
    {
        root=new tree;
        root->data=n;
        root->lc=root->rc=NULL;
    }
    else
    {
        if(n>root->data)
            create(root->rc,n);
        else
            create(root->lc,n);
    }
}
int compare(bitree &r1,bitree &r2)
{
    if(!r1&&!r2)
        return 1;
    else if(r1&&r2)
    {
        if(r1->data==r2->data)
            return (compare(r1->lc,r2->lc)&&compare(r1->rc,r2->rc));
    }
    return 0;
}
int main()
{
    int m,t,k,n,f;
    while(cin>>m>>t)
    {
        if(m==0)
            break;
        bitree root=NULL;
        k=m;
        while(k--)
        {
            cin>>n;
            create(root,n);
        }
        while(t--)
        {
            bitree r=NULL;
            k=m;
            while(k--)
            {
                cin>>n;
                create(r,n);
            }
            if(compare(root,r))
                cout<<"Yes"<<endl;
            else
                cout<<"No"<<endl;
        }
    }
    return 0;