//衆神雲集、羣魔亂舞、以一抵百、砥礪前行//8608 實現二叉排序樹的各種算法(2)

題目描述

Description
用函數實現如下二叉排序樹算法:
(1) 插入新結點
(2) 前序、中序、後序遍歷二叉樹
(3) 中序遍歷的非遞歸算法
(4) 層次遍歷二叉樹
(5) 在二叉樹中查找給定關鍵字(函數返回值爲成功1,失敗0)
(6) 交換各結點的左右子樹
(7) 求二叉樹的深度
(8) 葉子結點數

輸入格式
第一行:準備建樹的結點個數n
第二行:輸入n個整數,用空格分隔
第三行:輸入待查找的關鍵字
第四行:輸入待查找的關鍵字
第五行:輸入待插入的關鍵字

輸出格式
第一行:二叉樹的先序遍歷序列
第二行:二叉樹的中序遍歷序列
第三行:二叉樹的後序遍歷序列
第四行:查找結果
第五行:查找結果
第六行~第八行:插入新結點後的二叉樹的先、中、序遍歷序列
第九行:插入新結點後的二叉樹的中序遍歷序列(非遞歸算法)
第十行:插入新結點後的二叉樹的層次遍歷序列
第十一行~第十三行:第一次交換各結點的左右子樹後的先、中、後序遍歷序列
第十四行~第十六行:第二次交換各結點的左右子樹後的先、中、後序遍歷序列
第十七行:二叉樹的深度
第十八行:葉子結點數

輸入樣例
7
40 20 60 18 50 56 90
18
35
30

輸出樣例
40 20 18 60 50 56 90
18 20 40 50 56 60 90
18 20 56 50 90 60 40
1
0
40 20 18 30 60 50 56 90
18 20 30 40 50 56 60 90
18 30 20 56 50 90 60 40
18 20 30 40 50 56 60 90
40 20 60 18 30 50 90 56
40 60 90 50 56 20 30 18
90 60 56 50 40 30 20 18
90 56 50 60 30 18 20 40
40 20 18 30 60 50 56 90
18 20 30 40 50 56 60 90
18 30 20 56 50 90 60 40
4
4

作者 yqm

Version: 0

題解

這還要題解嗎?都是模板,沒啥好說的,自己思考一下就會寫了。我覺得這種題目還要題解的,就是來抄答案的,好了,代碼給你們了。

代碼如下:

#include<algorithm>
#include<iostream>
#include<cstdio>
#include<cmath>
#include<string>
#include<cstring>
#include<stack>
#include<queue>
using namespace std;
#define ll long long
#define maxn 0x3f3f3f3f
int n;
int sum=0,depth=0;
typedef struct BiTNode
{
    int data;
    struct BiTNode *lchild,*rchild;
} BiTNode,*BiTree;
int searchBST(BiTree T,int key,BiTree &p,BiTree f)
{
    if(!T)
    {
        p=f;
        return 0;
    }
    else if(T->data>key)
        searchBST(T->lchild,key,p,T);
    else if(T->data<key)
        searchBST(T->rchild,key,p,T);
    else
        return 1;
}
int InsertBST(BiTree &T,int key)
{
    BiTree p;
    if(!searchBST(T,key,p,NULL))
    {
        BiTree s;
        s=new BiTNode;
        s->data=key;
        s->lchild=NULL;
        s->rchild=NULL;
        if(!T)
            T=s;
        else if(p->data>s->data)
            p->lchild=s;
        else
            p->rchild=s;
    }
    else
        return 0;
}
void InOrderTraverse(BiTree T)
{
    if(T)
    {
        if(T->lchild)
            InOrderTraverse(T->lchild);
        cout<<T->data<<" ";
        if(T->rchild)
            InOrderTraverse(T->rchild);
    }
}
void FDGInOrderTraverse(BiTree T)
{
    stack<BiTree>p;
    while(T||!p.empty())
    {
        if(T)
        {
            p.push(T);
            T=T->lchild;
        }
        else
        {
            T=p.top();
            p.pop();
            cout<<T->data<<" ";
            T=T->rchild;
        }
    }
}
void PreOrderTraverse(BiTree T)
{
    if(T)
    {
        cout<<T->data<<" ";
        if(T->lchild)
            PreOrderTraverse(T->lchild);
        if(T->rchild)
            PreOrderTraverse(T->rchild);
    }
}
void PostOrderTraverse(BiTree T)
{
    if(T)
    {
        if(T->lchild)
            PostOrderTraverse(T->lchild);
        if(T->rchild)
            PostOrderTraverse(T->rchild);
        cout<<T->data<<" ";
    }
}
void swap_child(BiTree &T)
{
    queue<BiTree>s;
    s.push(T);
    while(!s.empty())
    {
        BiTree g=s.front();
        s.pop();
        BiTree temp=g->lchild;
        g->lchild=g->rchild;
        g->rchild=temp;
        if(g->lchild)
            s.push(g->lchild);
        if(g->rchild)
            s.push(g->rchild);
    }
}
void get_depth_sum(BiTree T,int step)
{
    if(T)
    {
        get_depth_sum(T->lchild,step+1);
        get_depth_sum(T->rchild,step+1);
        if(!T->lchild&&!T->rchild)
            sum++;
    }
    else
        depth=max(depth,step);
}
int main()
{
    BiTree T;
    T=new BiTNode;
    T=NULL;
    cin>>n;
    for(int i=0; i<n; i++)
    {
        int key;
        cin>>key;
        InsertBST(T,key);
    }
    PreOrderTraverse(T);
    cout<<'\n';
    InOrderTraverse(T);
    cout<<'\n';
    PostOrderTraverse(T);
    cout<<'\n';
    for(int i=0; i<2; i++)
    {
        cin>>n;
        BiTree temp;
        if(searchBST(T,n,temp,NULL))
            cout<<1<<'\n';
        else
            cout<<0<<'\n';
    }
    cin>>n;
    InsertBST(T,n);
    PreOrderTraverse(T);
    cout<<'\n';
    InOrderTraverse(T);
    cout<<'\n';
    PostOrderTraverse(T);
    cout<<'\n';
    FDGInOrderTraverse(T);
    cout<<'\n';
    queue<BiTree>s;
    s.push(T);
    while(!s.empty())
    {
        BiTree p=s.front();
        s.pop();
        cout<<p->data<<" ";
        if(p->lchild)
            s.push(p->lchild);
        if(p->rchild)
            s.push(p->rchild);
    }
    cout<<'\n';
    swap_child(T);
    PreOrderTraverse(T);
    cout<<'\n';
    InOrderTraverse(T);
    cout<<'\n';
    PostOrderTraverse(T);
    cout<<'\n';
    swap_child(T);
    PreOrderTraverse(T);
    cout<<'\n';
    InOrderTraverse(T);
    cout<<'\n';
    PostOrderTraverse(T);
    cout<<'\n';
    get_depth_sum(T,0);
    cout<<depth<<'\n';
    cout<<sum<<'\n';
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章