求已知前序后序可得不同二叉树的棵数
Posted aininot260
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了求已知前序后序可得不同二叉树的棵数相关的知识,希望对你有一定的参考价值。
已知一棵二叉树的前序和后序遍历,不一定能重建唯一的二叉树呢?
原因在于,当一个根只有一颗子树时,通过前序遍历和后序遍历,无法确定该子树是这个根的左子树还是右子树
abdegcf
,dgebfca
单子树的个数通过判定前序除了第一个根节点a外其他字母的前一个字母
和后序除了最后一个根结点a外其他字母的后一个字母是否相同求出
求得单子树的个数n后即可得出棵数为2^n
1 #include <iostream> 2 #include <string> 3 using namespace std; 4 5 int computeDiffTreeNum(string& str1, string& str2) { 6 int count = 1; 7 if (str1.length() <= 1) return 1; 8 for (int i = 1; i < str1.length(); i++) { 9 size_t posInStr2 = str2.find(str1[i]); 10 if (str1[i - 1] == str2[posInStr2 + 1]) count *= 2; 11 } 12 return count; 13 } 14 15 int main(int argc, const char * argv[]) { 16 using namespace std; 17 string str1, str2; 18 cin >> str1; 19 cin >> str2; 20 cout << computeDiffTreeNum(str1, str2); 21 return 0; 22 }
再来一份代码:
1 #include<stdio.h> 2 3 #include<string.h> 4 5 #define M 30 6 7 int count=0; 8 9 int power(int ans); 10 11 int main() 12 13 { 14 15 char a[M],b[M]; 16 17 int i=0,j=0; 18 19 int lengthA=0,lengthB=0; 20 21 gets(a); 22 23 gets(b); 24 25 lengthA=strlen(a),lengthB=strlen(b); 26 27 for(i=0;i<lengthA;i++) 28 29 for(j=1;j<lengthB;j++) 30 31 if(a[i]==b[j]&&a[i+1]==b[j-1]) 32 33 count++; 34 35 printf("%d ",power(ans)); 36 return 0; 37 } 38 39 int power(int ans) 40 { 41 int sum=1; 42 while(--ans>=0) sum*=2; 43 return sum; 44 }
以上是关于求已知前序后序可得不同二叉树的棵数的主要内容,如果未能解决你的问题,请参考以下文章