数据结构 前序遍历结果 中序遍历结果确定二叉树

    在写的时候,突然想到 如果二叉树中有相同的字母 ,那么根据前序遍历与中序遍历的结果确定的二叉树可能会出错比如 前序遍历的结果为a a a,中序遍历的结果也为a a a,则对于这种情况建的二叉树可能不一样,但同样满足要求,

下面的程序是在二叉树中没有相同的字母出现,从而能唯一确定二叉树

// 树中各字符均不相同,否则有可能建的数不唯一
#include <iostream>
#include <string.h>
using namespace std;
class tree
{
    public:
    char c;
    tree *lchild,*rchild;
};
int main()
{
    void deal(string str_pretravel,string str_intravel,tree* &p);
    void Pretravel(tree *p);
    void Intravel(tree *p);
    int i,j,n,m,s,t;
    tree *head;
    string str_pretravel,str_intravel;
    cout<<"请输入前序遍历的结果:"<<endl;
    cin>>str_pretravel;
    cout<<"请输入中序遍历的结果:"<<endl;
    cin>>str_intravel;
    deal(str_pretravel,str_intravel,head);
    //遍历二叉树
    cout<<"前序遍历的结果为:"<<endl;
    Pretravel(head);      //前序遍历
    cout<<endl;
    cout<<"中序遍历的结果为:"<<endl;
    Intravel(head);        //非递归中序遍历
    cout<<endl;
    return 0;
}
void deal(string str_pretravel,string str_intravel,tree* &p)
{
    int i,j;
    string s1,s2;
    string s4,s5;
    int x,l1,l2;
    char s3[10000];
    if(str_pretravel.size()==0)
    {
        p=NULL;
        return ;
    }
    p=new(tree);
    p->c=str_pretravel[0];
    for( i=0,j=0;i<=str_intravel.size()-1;i++)
    {
        if(str_intravel[i]==str_pretravel[0])
        {
            break;
        }else
        {
            s3[j++]=str_intravel[i];
        }
    }
    s3[j]='\0';  s1=s3;
    l1=i;
    for(i=i+1,j=0;i<=str_intravel.size()-1;i++)
    {
        s3[j++]=str_intravel[i];
    }
    s3[j]='\0';
    s2=s3;
    for(i=1,j=0;i<=l1;i++,j++)
    {
        s3[j]=str_pretravel[i];
    }
    s3[j]='\0';
    s4=s3;
    for(i=l1+1,j=0;i<=str_pretravel.size()-1;i++)
    {
        s3[j++]=str_pretravel[i];
    }
    s3[j]='\0';
    s5=s3;
    deal(s4,s1,p->lchild);  deal(s5,s2,p->rchild);
}
void Pretravel(tree *p)
{
    if(p)
    {
        cout<<p->c;
        Pretravel(p->lchild);
        Pretravel(p->rchild);
    }
}
void Intravel(tree *p)
{
    tree *statck[100000];
    int top=0;
    while(p||top>0)
    {
        if(p)
        {
            statck[top++]=p;
            p=p->lchild;
        }else
        {
            p=statck[--top];
            cout<<p->c;
            p=p->rchild;
        }
    }
}


 

### 重建二叉树的方法 通过前序遍历和中序遍历结果可以唯一确定一棵二叉树。这是因为前序遍历的第一个元素总是当前子树的根节点,在中序遍历序列中找到这个根节点的位置,就可以区分出左子树和右子树的部分。 #### 基本原理 在前序遍历列表中的首个元素表示整棵树的根节点[^1]。对于中序遍历而言,该根节点左侧的所有元素构成了其对应的左子树;右侧则对应着右子树[^2]。这一特性使得能够递归地解析并恢复原始结构。 #### 实现过程 为了实现上述逻辑,下面给出Python代码示例: ```python class TreeNode: def __init__(self, val=0, left=None, right=None): self.val = val self.left = left self.right = right def buildTree(preorder, inorder): if not preorder or not inorder: return None root_val = preorder.pop(0) root_index_in_inorder = inorder.index(root_val) node = TreeNode(val=root_val) node.left = buildTree(preorder[:root_index_in_inorder], inorder[:root_index_in_inorder]) node.right = buildTree(preorder[root_index_in_inorder:], inorder[root_index_in_inorder + 1:]) return node ``` 这段程序定义了一个`TreeNode`类用于创建新的节点实例,并实现了函数`buildTree()`来接收两个参数——分别是前序遍历(`preorder`)与中序遍历(`inorder`)得到的数值列表。此方法会不断移除前序遍历列表里的首项作为新建立节点的价值,同时依据这些值分割中序遍历列表成左右两部分继续构建子树直到完成整个重构工作。 #### 图解说明 假设存在如下输入数据: - `preorder`: `[3,9,20,15,7]` - `inorder`: `[9,3,15,20,7]` 按照以上描述的过程执行后可得下图所示结果(省略具体图形展示),其中每个圆圈代表一个节点及其存储的数据值,箭头指向表明父子关系方向。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值