• 重建二叉树---根据前序和中序遍历结果重建二叉树


    一颗二叉树:

    前序遍历结果: abdcef

    中序遍历结果:dbaecf

    基于递归的思想:在前序遍历中的第一个结点是根结点,然后在中序遍历中找到此根节点,然后递归的对左右子树分别重建。

    顺说一下,知道前序和后序遍历结果,我无法重建二叉树的,因为当某个结点只有一个儿子结点的时候,无法区分出到底是左还是右结点。

    #include <iostream>
    #include <cstring>
    using namespace std;
    struct Binode
    {
         char data;
         Binode *lhs;
         Binode *rhs;
    };
    void Rebuild_tree(char *preorder,char *inorder,int len,Binode *& root)
    {
    	if(preorder==NULL || inorder==NULL) return ;// 检查边界条件
    	
    	root=new Binode;
    	root->data=preorder[0];   //前序遍历的第一个结点作为根结点。 
    	root->lhs=root->rhs=NULL;
    	
    	if(len==1) return ; //当前树的长度为1,那么已经是最后一个结点。
    	
    	int leftlen=0;
    	char *pleftend=inorder;
    	while(*preorder!=*pleftend)
    	{
    		if(preorder==NULL || pleftend==NULL) return ;
    		pleftend++;
    	} 
    	leftlen=(int)(pleftend-inorder); //左子树长度
    	int rightlen=len-leftlen-1;      //右子树长度   
    	
    	//重建左子树 
    	if(leftlen>0)
    	{
    		Rebuild_tree(preorder+1,inorder,leftlen,root->lhs);
    	}	 
    	//重建右子树 
    	if(rightlen>0)
    	{
    		Rebuild_tree(preorder+leftlen+1,pleftend+1,rightlen,root->rhs);
    	}
    }
    void Post_Traversal(Binode *root)
    {
    	if(root->lhs) Post_Traversal(root->lhs);
    	if(root->rhs) Post_Traversal(root->rhs);
    	cout<<root->data<<" ";
    }
    int main()
    {
        char *preorder="abdcef";
        char *inorder="dbaecf";
        int len=strlen(inorder);
        Binode *root;
        Rebuild_tree(preorder,inorder,len,root);
        Post_Traversal(root);
    	return 0;
    
    }


  • 相关阅读:
    从一个Fragment跳转到另一个Fragment
    网站关键字排名查询
    wordpress添加百度统计
    WordPress:自定义页面模板
    wordpress的系统卡
    Android APK反编译就这么简单 详解(附图)
    关于使用apktool可以反编译无法回编译的解决问题
    移动广告联盟
    android studio 设备 unauthorized 问题解决
    使用Android Studio开发遇到的问题集合
  • 原文地址:https://www.cnblogs.com/keanuyaoo/p/3295171.html
Copyright © 2020-2023  润新知