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;
    }
    
    
    
  • 相关阅读:
    Linux常用命令大全
    Activity的launchMode详细分析
    StringBuilder与StringBuffer的区别(转)
    CSS那些事儿-阅读随笔3(清除浮动)
    CSS那些事儿-阅读随笔2(选择符的组合与优先级/权重)
    CSS那些事儿-阅读随笔1(CSS简介与选择符)
    js快速打印一个五分制(五颗星)的评分情况
    jQgrid问题总结
    Webstorm10.0.4注册码
    浅谈Websocket、Ajax轮询和长连接(long pull)
  • 原文地址:https://www.cnblogs.com/wlw-x/p/12932595.html
Copyright © 2011-2022 走看看