C++已知先序遍历序列中序遍历序列建立二叉树;已知后序遍历序列中序遍历序列建立二叉树

如题,已知先序中序/后序中序建立一棵二叉树。

        我们手工建树的时候,比如一个例子:先序序列:ADECFG,中序序列:DBEAFCG。首先我们都会从先序序列中找到第一个元素A,该元素也就是这个树的根。然后再在中序序列中找到一样的元素A,,这样会将中序序列分成两个子序列(DBE) (FCG),分别是左子树与右子树。然后将子序列再看成一棵树。显然这是一个递归的过程。所以只需要把首层的搞清楚。

  • 算法思想:两个数组a[], b[], 分别是树的先序序列和中序序列。p1,q1代表a[]的首尾;p2,q2代表b[的首尾。首先先取a[p1]的值(也就是例子中的A),其次在b[]中找到该值,并返回下标。定义llen(左子树长度),rlen(右子树长度)。求出分得的子序列长度执行递归即可。//函数参数列表 CreateLBTree1(LBTree*& lbt, char a[], char b[], int p1, int q1, int p2, int q2)
  • 算法C++描述
    //先序中序确定树
    void CreateLBTree1(LBTree*& lbt, char a[], char b[], int p1, int q1, int p2, int q2)
    {
    	int llen, rlen;
    	lbt = (LBTree*)malloc(sizeof(LBTree));
    	lbt->data = a[p1];
    	int i;
    	for (i = p2; b[i] != lbt->data; ++i);
    	llen = i - p2;
    	rlen = q2 - i;
    	if (llen)
    		CreateLBTree1(lbt->lchild, a, b, p1 + 1, p1 + llen, p2, p2 + llen - 1);
    	else
    		lbt->lchild = NULL;
    	if (rlen)
    		CreateLBTree1(lbt->rchild, a, b, q1 - rlen + 1, q1, q2 - rlen + 1, q2);
    	else
    		lbt->rchild = NULL;
    }
  • 后序中序建树的过程与之相似这里只提供代码:

    //后序中序确定树
    void CreateLBTree2(LBTree*& lbt, char a[], char b[], int p1, int q1, int p2, int q2)
    {
    	int llen, rlen;
    	lbt = (LBTree*)malloc(sizeof(LBTree));
    	lbt->data = a[q1];
    	int i;
    	for (i = p2; b[i] != lbt->data; ++i);
    	llen = i - p2;
    	rlen = q2 - i;
    	if (llen)
    		CreateLBTree2(lbt->lchild, a, b, p1, p1 + llen - 1, p2, p2 + llen - 1);
    	else
    		lbt->lchild = NULL;
    	if (rlen)
    		CreateLBTree2(lbt->rchild, a, b, q1 - rlen, q1 - 1, q2 - rlen + 1, q2);
    	else
    		lbt->rchild = NULL;
    }

    该算法的关键就是在调用递归函数时的参数的赋值。也就是子序列首尾的值。

发布了16 篇原创文章 · 获赞 25 · 访问量 1137

猜你喜欢

转载自blog.csdn.net/weixin_41546300/article/details/102868005