#include<bits/stdc++.h>
using namespace std;
int i,cnt,now ;
string str,pre,mid,fin;//后三个分别为先序序列,中序序列,后序序列
struct Node
{
char data;
Node *left,*right;
};
void DFS(Node *root)//先序遍历输出二叉树,中序后序只需要改变三条语句的对应位置
{
if(root)
{
cout<<root->data;
DFS(root->left);
DFS(root->right);
}
}
int gethigh(Node *root)//求二叉树高度
{
if(!root)
return 0;
else
return max(gethigh(root->left),gethigh(root->right))+1;
}
Node *fibuild(int l,int r)//根据中后序建立二叉树,需要使now初始值设为fin.size()-1
{
if(l>r) return NULL;
int m;
for(int i=l;i<=r;i++)
{
if(fin[now]==mid[i])
{
m=i;
break;
}
}
Node *root=new Node;
root->data=fin[now--];
root->right=fibuild(m+1,r);
root->left=fibuild(l,m-1);
return root;
}
Node *rebuild(int l,int r)//根据前中序建立二叉树,需要使now初始值设为0
{
if(l>r) return NULL;
int m;
for(int i=l;i<=r;i++)
{
if(pre[now]==mid[i])
{
m=i;
break;
}
}
Node *root=new Node;
root->data=pre[now++];
root->left=rebuild(l,m-1);
root->right=rebuild(m+1,r);
return root;
}
Node *build()//读取先序遍历的字符序列建立二叉树
{
if(str[i]==',')
{
i++;
return NULL;
}
Node* now;
now=(Node*)malloc(sizeof(Node));
now->data=str[i++];
now->left=build();
now->right=build();
return now;
}
void find(Node *root)//统计叶子数
{
if(root)
{
if(root->left==NULL&&root->right==NULL)
{
cnt++;
}
find(root->left);
find(root->right);
}
}
void findprint(Node *root)//层序遍历输出叶子
{
queue<Node*> q;
if(root)
{
q.push(root);
}
while(!q.empty())
{
if(q.front()->left==NULL&&q.front()->right==NULL)
{
cout<<q.front()->data;
}
if(q.front()->left)
{
q.push(q.front()->left);
}
if(q.front()->right)
{
q.push(q.front()->right);
}
q.pop();
}
}
void floorprint(Node *root)//层序遍历输出二叉树
{
queue<Node*> q;
if(root)
{
q.push(root);
}
while(!q.empty())
{
cout<<q.front()->data;
if(q.front()->left)
{
q.push(q.front()->left);
}
if(q.front()->right)
{
q.push(q.front()->right);
}
q.pop();
}
}
int main()
{
while(cin>>str)
{
i=0,cnt=0;
Node *root=build();
DFS(root);
}
}
二叉树(待补充还原部分)
于 2023-01-05 16:32:35 首次发布