• 【王道例3.4】通过二叉树遍历结果建立二叉树


    题目

    思路

    根据先序遍历可以知道第一个字符一定是根节点,然后在中序遍历中,找到对应的根节点,则其左边的字母组成了左子树,右边的字母组成了右子树。
    例如示例中:

    代码

    #include<bits/stdc++.h> 
    using namespace std;
    typedef struct BiNode{
    	struct BiNode *lchild;
    	struct BiNode *rchild;
    	char data;
    }*BiTree;
    string s1,s2;      //s1存储前序遍历,s2存储中序遍历 
    int cen=0; 
    
    //分析s2 p~q段,s1 a~b段 建立二叉树T
    void BuildTree(BiTree &T,int p,int q,int a,int b)
    {
    	T=(BiTree)malloc(sizeof(BiNode));
    	T->data=s1[a];                      //先序第一个一定为此时的根节点
    	T->lchild=T->rchild=NULL;
    	
    	int loc;
    	for(int i=p;i<=q;i++)              //找出跟结点在中序遍历的位置,将左右子树隔开
    	{
    		if(T->data==s2[i])
    		{
    			loc=i;
    			break;
    		}
    	}
    	if(loc!=p)       //左子树存在
    	{
    		BuildTree(T->lchild,p,loc-1,a+1,a+(loc-p));      //loc-p为左边字符串的宽度
    	} 
    	if(loc!=q)      //右子树存在 
    	{
    		BuildTree(T->rchild,loc+1,q,a+(loc-p)+1,b);
    	}
    }
    
    void PostOrderTraverse(BiTree T)
    {
    	if(!T)
    		return;
    	else if(T!=NULL)
    	{
    		if(T->lchild!=NULL)
    		PostOrderTraverse(T->lchild);
    		if(T->rchild!=NULL)
    		PostOrderTraverse(T->rchild);
    		
    		cout<<(T->data);
    	}
    }
    int main()
    {
    	int p,q,loc;
    	cin>>s1>>s2;
    	BiTree T;
    	/*T=(BiTree) malloc(sizeof(BiNode));
    	T->data=s1[0];
    	*/
    
    	p=0;
    	q=s2.size();
    	BuildTree(T,p,q-1,p,q-1);      //p为第一个字母下标,q为最后一个
    	PostOrderTraverse(T);
    	cout<<endl;
    	return 0;
    }
    
  • 相关阅读:
    latex How do I know what symbols/characters are available in a font package
    fun字形
    inspection tool
    msys2 安装 基本配置
    R语言 测试 训练步骤
    R 语言描述性 数据分析 步骤
    如何构建分类模型
    史上最酷的数学动态图
    极大似然估计四个步骤
    react 组件间参数传递
  • 原文地址:https://www.cnblogs.com/wwj321/p/12362679.html
Copyright © 2020-2023  润新知