7-9 还原二叉树(25 point(s))(根据前序遍历和中序遍历建树)
来源:互联网 发布:柱状图数据ae模板 编辑:程序博客网 时间:2024/06/05 15:33
7-9 还原二叉树(25 point(s))
给定一棵二叉树的先序遍历序列和中序遍历序列,要求计算该二叉树的高度。
输入格式:
输入首先给出正整数N(≤50),为树中结点总数。下面两行先后给出先序和中序遍历序列,均是长度为N的不包含重复英文字母(区别大小写)的字符串。
输出格式:
输出为一个整数,即该二叉树的高度。
输入样例:
9ABDFGHIECFDHGIBEAC
输出样例:
5根据前序和中序判断后序和根据中序和后序判断前序代码类似,只需稍微改动数组即可
#include <stdio.h>#include <string.h>#include <stdlib.h>int n;char pre[60],in[60];struct TNode{int Data;struct TNode* Left;struct TNode* Right;};//二叉树的结构体 typedef struct TNode* Tree;Tree restoreTree(char pre[],char in[],int n){//还原二叉树的函数 int i;char lpre[60],rpre[60];char lin[60],rin[60];int n1 = 0,n2 = 0;//n1记录前序遍历序列的左子树长度n2则记录前序遍历序列的右子树长度 int m1 = 0,m2 = 0;//m1记录中序遍历序列的左子树长度m2记录中序遍历序列右子树长度if(n==0){//如果长度为零说明这可子树建完了返回NULL return NULL;}Tree T = (Tree)malloc(sizeof(struct TNode));if(T==NULL){return NULL;//若内存满了,返回NULL; }T->Data = pre[0];//每一次,一定是前序遍历的第一个作为根节点,然后再去建左右子树//下面是关键,通过根节点把中序遍历分出左右子树,然后再根据这个分好的长度,再把前序遍历分成相同长度,依次确定根节点,递归实现//分中序遍历序列 for(i = 0; i < n; i++){if(i<=n1&&in[i]!=pre[0]){//中序遍历被根节点分开的左子树的点 lin[n1] = in[i];n1++;}else if(in[i]!=pre[0]){//右子树的点,注意是else if,因为这个时候i是大于n1的 rin[n2] = in[i];n2++;}}//分前序遍历序列,注意!这里从1开始循环,因为0号元素作为根 for(i = 1; i < n; i++){if(i<(n1+1)){lpre[m1] = pre[i];m1++;}else{rpre[m2] = pre[i];m2++;}}T->Left = restoreTree(lpre,lin,n1);T->Right = restoreTree(rpre,rin,n2);return T;//最后一定要return这颗树,要不然怎么算高。。。 }int getHight(Tree BST){//得到树的高度,已知左右树高,树高为max(左树高,右树高)+1; int lh,rh;if(BST==NULL){return 0;}else {lh = getHight(BST->Left);rh = getHight(BST->Right); return (lh>rh?lh:rh)+1;} }int main(){scanf("%d",&n);scanf("%s",pre);scanf("%s",in);//输入 Tree BST = NULL;BST = restoreTree(pre,in,n);//建树 int hight;hight = getHight(BST);//求高 printf("%d\n",hight);//输出 return 0;}
阅读全文
0 0
- 7-9 还原二叉树(25 point(s))(根据前序遍历和中序遍历建树)
- 二叉树 根据前序遍历和中序遍历 或者 后序遍历和中序遍历建树
- 根据前序和中序遍历还原二叉树后序遍历(hihocoder 1049)
- 【二叉树】根据二叉树的中序遍历和前序遍历,还原二叉树
- 根据二叉树的前序遍历和中序遍历(或者中序遍历和后序遍历)还原二叉树
- 根据前序遍历和中序遍历还原二叉树
- 数据结构——根据前序遍历和中序遍历还原二叉树
- 建树和遍历树(前序)
- 二叉树——根据先序(后序)和中序遍历建树
- 【LeetCode】根据前序和中序遍历建树 && 根据中序遍历和后续遍历建树
- 二叉树遍历 ,根据先序和中序遍历序列建树
- (剑指offer笔记)根据前序遍历和中序遍历重建二叉树
- Java二叉树(二)--根据前序和中序遍历求后序遍历
- 面试题6:重建二叉树(根据前序遍历和中序遍历)
- 根据前序遍历和中序遍历恢复二叉树(附代码)
- 根据前序遍历和中序遍历结果重建二叉树(递归方法)
- 根据前序遍历-中序遍历结果 来还原一颗二叉树
- 根据一个树的中序遍历和前序遍历数据,还原一个二叉树的思考
- hdu2049错排问题
- 状态估计问题学习记录(1)
- Struts2接受请求参数三种常用方法
- 开发编程学习~字符编码表总结
- Apriori算法进行关联分析(2)
- 7-9 还原二叉树(25 point(s))(根据前序遍历和中序遍历建树)
- 2.5 寻找最大的K个数
- 【数据库基础】详解函数依赖与键【码】
- 习题 6.13
- 36. Valid Sudoku
- 最小堆及基于最小堆的最小优先队列
- matlab
- Mybatis学习笔记(七)【输入映射】
- HDU