題目描述
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;
}