树型数据结构总结

前序,中序,后序知二推一

求先序序列

题目描述
给出一棵二叉树的中序与后序排列,求出它的先序排列,(约定树结点用不同的大写字母表示,长度≤8)。

输入格式
2行,均为大写字母组成的字符串,表示一棵二叉树的中序与后序排列。

输出格式
1行,表示一棵二叉树的先序。

输入

BADC
BDCA

输出

ABCD

#include<iostream>
#include<string>
using namespace std;

string in;
string post;

struct TreeNode{
   
    char data;
    TreeNode* left;
    TreeNode* right;
    TreeNode(char data):data(data),left(NULL),right(NULL){
   }
};

TreeNode* Tree[10000];

TreeNode* CreatTree(int s1,int t1,int s2,int t2){
   
    char c=post[t1];//后序的最后一个
    if(s1==t1){
   //叶子结点
        Tree[c-'A']=new TreeNode(c);
        return Tree[c-'A'];
    }
    Tree[c-'A']=new TreeNode(c);
    int pos=in.find(c);//在中序中找到对应的顶点以及左右长度
    int llen=pos-s2;
    int rlen=t2-pos;
    //别忘了判左右长度
    if(llen) Tree[c-'A']->left=CreatTree(s1,s1+llen-1,s2,s2+llen-1);
    if(rlen) Tree[c-'A']->right=CreatTree(s1+llen,t1-1,s2+llen+1,t2);
    return Tree[c-'A'];
}

void PreOrder(TreeNode* root){
   
    if(root==NULL) return ;
    cout<<root->data;
    PreOrder(root->left);
    PreOrder(root->right);
}

int main(){
   
    cin>>in>>post;
    TreeNode* root=CreatTree(0,post.size()-1,0,in.size()-1);
    PreOrder(root);
}

求可能中序序列

题目描述
已知前序和后序遍历的结果求出一种可能得中序遍历的结果,二叉树的结点名以大写字母(A,B,C…)表示,最多26个结点
输入格式
第一行为前序遍历结果
第二行为后序遍历结果
输出格式
一个字符串,表示一个可能的中序遍历
输入

ABDCE
DBECA

输出

DBAEC

#include<iostream>
#include<string>

using namespace std;

string pre,post;

struct TreeNode{
   
    char data;
    TreeNode* left;
    TreeNode* right;
    TreeNode(char data):data(data),left(NULL),right(NULL){
   }
};

TreeNode* PrePostCreat(string pre,string post){
   
    TreeNode* root=new TreeNode(pre[0]);
    if(pre.size()==0) return NULL;//返回
    int pos=post.find(pre[1]);//先序顶点在后序的位置
//    cout<<pre.substr(1,pos+1)<<"   "<<post.substr(0,pos+1)<<endl;
//    cout<<pre.substr(pos+2)<<"   "<<post.substr(pos+1,post.size()-pos-2)<<endl;
    root->left=PrePostCreat(pre.substr(1,pos+1),post.substr(0,pos+1));
    root->right=PrePostCreat(pre.substr(pos+2),post.substr(pos+1,post.size()-pos-2));
    return root;
}

void InOrder(TreeNode* T){
   
    if(T==NULL) return ;
    InOrder(T->left);
    cout<<T->data;
    InOrder(T->right);
}

int main(){
   
    cin>>pre>>post;
    TreeNode* root=PrePostCreat(pre,post);
    InOrder(root);
}

二叉排序树

构造二叉排序树

题目描述
已知二叉排序树用二叉链表存储,结点的关键字为 1正整数。从键盘输入结点的关键字(以 0表示结束)建立一棵二叉排序树,并输出其后序遍历序列

#include<iostream>
#include<vector>
using namespace std;
vector<int> v;
struct TreeNode{
   
    int data;
    TreeNode* left;
    TreeNode* right;
    TreeNode(int data):data(data),
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值