//8606 二叉树的构建及遍历操作
#include <iostream>
using namespace std;
#include "stdio.h"
#include "malloc.h"
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int Status;
typedef char ElemType;
typedef struct BiTNode{
ElemType data;
struct BiTNode *lchild,*rchild;//左右孩子指针
} BiTNode,*BiTree;
Status CreateBiTree(BiTree &T) { // 算法6.4
// 按先序次序输入二叉树中结点的值(一个字符),’#’字符表示空树,
// 构造二叉链表表示的二叉树T。
char ch;
scanf("%c",&ch);
if (ch=='#') T = NULL;
else {
if (!(T = (BiTNode *)malloc(sizeof(BiTNode)))) return ERROR;
T->data=ch; // 生成根结点
CreateBiTree(T->lchild); // 构造左子树
CreateBiTree(T->rchild); // 构造右子树
}
return OK;
} // CreateBiTree
Status PreOrderTraverse( BiTree T) {
// 前序遍历二叉树T的递归算法
//补全代码,可用多个语句
if(T)
{
cout<<T->data;
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
return OK;
}
else
return ERROR;
} // PreOrderTraverse
Status InOrderTraverse( BiTree T) {
// 中序遍历二叉树T的递归算法
//补全代码,可用多个语句
if(T)
{
InOrderTraverse(T->lchild);
cout<<T->data;
InOrderTraverse(T->rchild);
return OK;
}
else
return ERROR;
} // InOrderTraverse
Status PostOrderTraverse( BiTree T) {
// 后序遍历二叉树T的递归算法
//补全代码,可用多个语句
if(T)
{
PostOrderTraverse(T->lchild);
PostOrderTraverse(T->rchild);
cout<<T->data;
return OK;
}
else
return ERROR;
} // PostOrderTraverse
int main() //主函数
{
BiTree T=new BiTNode;
CreateBiTree(T);
PreOrderTraverse(T);
cout<<endl;
InOrderTraverse(T);
cout<<endl;
PostOrderTraverse(T);
cout<<endl;
return 0;
//补充代码
}//main
//17121 求二叉树各种节点数
#include "stdio.h"
#include "malloc.h"
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int Status;
#include <iostream>
using namespace std;
typedef char ElemType;
typedef struct BiTNode{
ElemType data;
struct BiTNode *lchild,*rchild;//左右孩子指针
} BiTNode,*BiTree;
int num1=0,num2=0,num0=0;
Status CreateBiTree(BiTree &T) { // 算法6.4
// 按先序次序输入二叉树中结点的值(一个字符),’#’字符表示空树,
// 构造二叉链表表示的二叉树T。
char ch;
scanf("%c",&ch);
if (ch=='#') T = NULL;
else {
if (!(T = (BiTNode *)malloc(sizeof(BiTNode)))) return ERROR;
T->data=ch;// 生成根结点
CreateBiTree(T->lchild) ; // 构造左子树
CreateBiTree(T->rchild); // 构造右子树
}
return OK;
} // CreateBiTree
int calculate(BiTree T)
{
if(!T)
return 0;
if(T->lchild!=NULL&&T->rchild!=NULL)
num2++;
else if(T->lchild==NULL&&T->rchild!=NULL||T->lchild!=NULL&&T->rchild==NULL)
num1++;
else if(T->lchild==NULL&&T->rchild==NULL)
num0++;
calculate(T->lchild);
calculate(T->rchild);
}
int main() //主函数
{
BiTree T=new BiTNode;
CreateBiTree(T); //补充代码
calculate(T);
cout<<num2<<endl;
cout<<num1<<endl;
cout<<num0<<endl;
return 0;
}//main
//18924 二叉树的宽度
#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <malloc.h>
#include <queue>
using namespace std;
int v[105][2]={'\0'},ans=1;//初始最大宽度为1
int main()
{
int n;
cin>>n;
int x,y;
for(int i=1;i<n;i++)//因为题目的节点的值是数字所以可以用数组来存储。如果是字符的话就不行
{
cin>>x>>y;
if(!v[x][0])
v[x][0]=y;
else if(!v[x][1])
v[x][1]=y;
}
queue<int>p;
p.push(1);
while(p.size())
{
int len;
int t;
len=p.size();
ans=max(ans,len);
for(int i=0;i<len;i++)
{
t=p.front();
p.pop();
if(v[t][0])
p.push(v[t][0]);
if(v[t][1])
p.push(v[t][1]);
}
}
cout<<ans<<endl;
return 0;
}
//二叉树的遍历运算
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <string>
using namespace std;
void Traverse(string pre,string in)
{
if(pre=="\0" || in=="\0")
return;
int pos=in.find(pre[0]);//根据先序找到根结点在中序的位置,在in中找pre【0】所以in一个都不能少
Traverse(pre.substr(1,pos),in.substr(0,pos));//左子树
Traverse(pre.substr(pos+1),in.substr(pos+1));//右子树
cout<<pre[0];
}
int main()
{
string pre,in;
cin >> pre >> in;
Traverse(pre,in);
return 0;
}
//18923 二叉树的直径
#include <iostream>
#include <queue>
#include <algorithm>
using namespace std;
int ans=0;
int child[55][2];
int dfs(int root)
{
if(!root)
return 0;
int lchild=dfs(child[root][1]);
int rchild=dfs(child[root][2]);
int len=max(lchild,rchild)+1;
ans=max(ans,lchild+rchild);
return len;
}
int main()
{
int n;
cin>>n;
for(int i=1;i<n;i++)
{
int x,y;
cin>>x>>y;
if(!child[x][1])
child[x][1]=y;
else
child[x][2]=y;
}
dfs(1);
cout<<ans<<endl;
return 0;
}