zoukankan      html  css  js  c++  java
  • 【模板】已知二叉树两种序列求另外一种序列--非建树

    思路:
    给出二叉树的先序和中序遍历
    要求求出后序遍历
    我们知道根据先序遍历和另外一种遍历我们
    可以建立以可二叉树,但是应该存在一种更简单的
    办法使得不用建树也能够成功得到序列

    首先我们都知道:

    1. 先序遍历的第一个结点一定是根节点
    2. 后序遍历的最后一个结点一定是根节点

    我们只需要在中序遍历中找到该根节点
    该节点的左边是左子树,右边是右子树
    递归即可

    根据先序和中序求解后序

    // 根据先序求后后续遍历 k = i - p;
    void postorder(int x,int y,int p,int q)
    {
    	printf("此时  后序区间为[%d, %d],中序区间[%d, %d]
    ",x , y , p , q);
    	if(x > y || p > q)return;
    	int i = a.find(b[x]); // 在中序遍历中找到当前先序区间中的第一个
    	printf("此时 i = %d 
    ",i);
    	int k = i - p;
    	postorder(x + 1, x + k, p , i - 1);
    	postorder(x + k + 1, y, i + 1,  q);
    	cout << b[x];
    }
    

    根据后序和中序求先序

    // 根据后续求先序 k = p - i	
    void preorder(int x,int y,int p,int q)
    {
    	//printf("此时  后序区间为[%d, %d],中序区间[%d, %d]
    ",x , y , p , q);
    	if(x > y || p > q)return;
    	int i = a.find(b[y]); // 在中序遍历中找到当前先序区间中的第一个
    	//printf("此时 i = %d
    ",i);
    	cout << b[y];
    	int k = q - i;
    	preorder(x , y - k - 1, p , i - 1);
    	preorder(y - k, y - 1,i + 1,  q);
    }
    
    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <cstdlib>
    using namespace std;
    const int N = 100;
    string a , b;
    int n;
    
    // 根据先序求后序遍历 k = i - p;
    void postorder(int x,int y,int p,int q)
    {
    	printf("此时  后序区间为[%d, %d],中序区间[%d, %d]
    ",x , y , p , q);
    	if(x > y || p > q)return;
    	int i = a.find(b[x]); // 在中序遍历中找到当前先序区间中的第一个
    	printf("此时 i = %d 
    ",i);
    	int k = i - p;
    	postorder(x + 1, x + k, p , i - 1);
    	postorder(x + k + 1, y, i + 1,  q);
    	cout << b[x];
    }
    
    // 根据后序求先序 k = p - i	
    void preorder(int x,int y,int p,int q)
    {
    	//printf("此时  后序区间为[%d, %d],中序区间[%d, %d]
    ",x , y , p , q);
    	if(x > y || p > q)return;
    	int i = a.find(b[y]); // 在中序遍历中找到当前先序区间中的第一个
    	//printf("此时 i = %d
    ",i);
    	cout << b[y];
    	int k = q - i;
    	preorder(x , y - k - 1, p , i - 1);
    	preorder(y - k, y - 1,i + 1,  q);
    }	
    int main()
    {
    	cin >> a >> b;
    	n = a.size() - 1; // 注意这里的 n 去 size() - 1 !!!, 且下标从 0 开始
    	preorder(0,n,0,n);
    	return 0;
    }
    
    
    
  • 相关阅读:
    RabbitMQ(四)
    RabbitMQ(三)
    RabbitMQ(二)
    定位
    响应式布局
    学习前端的一些心得
    css样式大全
    常用标签
    HTML
    app 被拒绝原因
  • 原文地址:https://www.cnblogs.com/wlw-x/p/12932595.html
Copyright © 2011-2022 走看看