zoukankan      html  css  js  c++  java
  • 《剑指Offer》面试题-重建二叉树

    题目描述:

    输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并输出它的后序遍历序列。

     

    输入:

    输入可能包含多个测试样例,对于每个测试案例,

    输入的第一行为一个整数n(1<=n<=1000):代表二叉树的节点个数。

    输入的第二行包括n个整数(其中每个元素a的范围为(1<=a<=1000)):代表二叉树的前序遍历序列。

    输入的第三行包括n个整数(其中每个元素a的范围为(1<=a<=1000)):代表二叉树的中序遍历序列。

    输出:

    对应每个测试案例,输出一行:

    如果题目中所给的前序和中序遍历序列能构成一棵二叉树,则输出n个整数,代表二叉树的后序遍历序列,每个元素后面都有空格。

    如果题目中所给的前序和中序遍历序列不能构成一棵二叉树,则输出”No”。

    样例输入:
    8
    1 2 4 7 3 5 6 8
    4 7 2 1 5 3 8 6
    8
    1 2 4 7 3 5 6 8
    4 1 2 7 5 3 8 6
    
    样例输出:
    7 4 2 5 8 6 3 1 
    No
    

    说明: 其实就是给出先序、中序,求后序。

    思路: 

    1、先序遍历是从左到右遇到根输出

    2、在先序中找到一个根节点,并且在中序中找到它的位置,那么左右子树就在它左右两边

    3、根据二叉树递归性质,设两个指针i、j指向中序序列的一段,i = 1、j = n, 就可以算出整个树

    4、如何判断能否构成整棵树,要枚举所有情况,递归判断是否合法,如果递归到仅有一个叶子节点,那便合法

    代码(用偷懒的方法判断合法):

    #include <stdio.h>
    #include <stdlib.h>
    int ino[1002];
    int pre[1002];
    
    typedef struct btnode *btlink;
    typedef struct btnode{
    	int data;
    	btlink left;
    	btlink right;
    }Btnode;
    
    int p, n;
    
    int findino(int num){
    	int t;
    	for(t = n; 0 < t; --t)
    		if(ino[t] == num)
    			return t;
    	return t;
    }
    
    btlink create(int i, int j){
    	btlink t;
    	int k;
    	if(p > n+1) return 0;
    	if(i > j) t = 0;
    	else{
    		t = malloc(sizeof(Btnode));
    		t->data = pre[p];
    		k = findino(pre[p++]);
    		t->left = create(i, k-1);
    		t->right = create(k+1 , j);
    	}
    	return t;
    }
    
    void tail_order(btlink t){
    	if(t){
    		tail_order(t->left);
    		tail_order(t->right);
    		printf("%d ", t->data);
    	}
    }
    
    int main(int argc, char const *argv[])
    {
    	int i;
    	while(~scanf("%d", &n)){
    		for(i=1;i<=n;++i) scanf("%d", &pre[i]);
    		for(i=1;i<=n;++i) scanf("%d", &ino[i]);
    		p = 1;
    		btlink L = create(1, n);
    		if(p == n+1)	tail_order(L);
    		else printf("No");
    		printf("
    ");
    	}
    	return 0;
    }
    

      

  • 相关阅读:
    Windows Server 2003 SP2(32位) 中文版 下载地址 光盘整合方法
    用Recycle()方法对Java对象的重要性
    Lotus中千奇百怪的 $$
    Developing a simple application using steps "User Decision" and "Mail"(1) 沧海
    沟通中的情绪管理(演讲稿) 沧海
    人只有在压力之下,才可能成功,没做一件事,都必须成功,不许言败 沧海
    什么是IDOC,以及IDOC的步骤 沧海
    VS2008 Professional Edition CHS中的deffactory.dat读取错误 沧海
    Including custom text in the step "User Decision" 沧海
    SAP Upgrade Strategy 沧海
  • 原文地址:https://www.cnblogs.com/firstrate/p/3539316.html
Copyright © 2011-2022 走看看