给定二叉树T(树深度不超过H<=10,深度从1开始,节点个数N<1024,节点编号1~N)的层序和中序遍历,输出T从左向右叶子节点以及树先序和后序遍历序列
输入描述:
输入两行,分别代表层序和中序遍历结果,节点编号按单个空格分开
输出描述:
依次输出 从左向右叶子节点 ,先序, 后序 遍历 。 节点编号按空格分开
示例1
输入
复制
3 5 4 2 6 7 1 2 5 3 6 4 7 1
输出
复制
2 6 1 3 5 2 4 6 7 1 2 5 6 1 7 4 3
程序:
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
class TreeNode
{
public:
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int val)
{
this->val=val;
this->left=this->right=NULL;
}
};
TreeNode *bulidTree(vector<int> &cengxu,vector<int>&zhongxu)
{
if(cengxu.size()==0 || zhongxu.size()==0)
return NULL;
TreeNode *root=new TreeNode(cengxu[0]);
int tag=0;
for(int i=0;i<zhongxu.size();i++)
{
if(zhongxu[i]==cengxu[0])
{
tag=i;
break;
}
}
vector<int>zhongxuleft(zhongxu.begin(),zhongxu.begin()+tag);
vector<int>zhongxuright(zhongxu.begin()+tag+1,zhongxu.end());
vector<int>cengxuleft,cengxuright;
for(int i=1;i<cengxu.size();i++)
{
for(int j=0;j<tag;j++)
{
if(cengxu[i]==zhongxu[j])
{
cengxuleft.push_back(cengxu[i]);
break;
}
}
}
for(int i=1;i<cengxu.size();i++)
{
for(int j=tag+1;j<zhongxu.size();j++)
{
if(cengxu[i]==zhongxu[j])
{
cengxuright.push_back(cengxu[i]);
break;
}
}
}
root->left=bulidTree(cengxuleft,zhongxuleft);
root->right=bulidTree(cengxuright,zhongxuright);
return root;
}
void preorder(TreeNode *root,vector<int>&preorder_arr)
{
if(!root)
return;
preorder_arr.push_back(root->val);
preorder(root->left,preorder_arr);
preorder(root->right,preorder_arr);
}
void posorder(TreeNode *root,vector<int>&posorder_arr)
{
if(!root)
return;
posorder(root->left,posorder_arr);
posorder(root->right,posorder_arr);
posorder_arr.push_back(root->val);
}
void leaf(TreeNode *root,vector<int>&leaf_arr)
{
if(!root)
return;
if(!root->left && !root->right)
leaf_arr.push_back(root->val);
if(root->left)
leaf(root->left,leaf_arr);
if(root->right)
leaf(root->right,leaf_arr);
}
int main()
{
vector<int>cengxu;
vector<int>zhongxu;
vector<int>preorder_arr;
vector<int>posorder_arr;
vector<int>leaf_arr;
int m,n;
while(cin>>m)
{
cengxu.push_back(m);
if(cin.get()=='\n')
break;
}
while(cin>>n)
{
zhongxu.push_back(n);
if(cin.get()=='\n')
break;
}
TreeNode *root=bulidTree(cengxu,zhongxu);
leaf(root,leaf_arr);
preorder(root,preorder_arr);
posorder(root,posorder_arr);
for(int i=0;i<leaf_arr.size();i++)
cout<<leaf_arr[i]<<" ";
cout<<endl;
for(int i=0;i<preorder_arr.size();i++)
cout<<preorder_arr[i]<<" ";
cout<<endl;
for(int i=0;i<posorder_arr.size();i++)
cout<<posorder_arr[i]<<" ";
cout<<endl;
return 0;
}