已知二叉树的中序序列为DBGEAFC,后序序列为DGEBFCA,给出相应的二叉树

面对这种问题时我们该怎么解决?

今天写数据结构题。发现了一道总是碰见问题的题在这里我写了一种求解方法我自己称它为分层递归求解。

第一步通过观察我们知道后序遍历时最后一个是根节点A

在中序序列中A的左边是左子树右边是右子树

第二步我们来画第一层为根节点的右子树为A-C-F

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc29uZ2p1bnlhbg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" >

第三步拆分左子树

在中序序列中为DBGE(由于我们不知道左子树中的树结构无法直接看出来就把左子树另外拆分出来看)在后序序列中为DGEB

第五步模仿第一步和第二步的做法来画

这个时候我们能够得到左子树的结构例如以下:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc29uZ2p1bnlhbg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" >

时间: 2024-10-22 04:09:24

已知二叉树的中序序列为DBGEAFC,后序序列为DGEBFCA,给出相应的二叉树的相关文章

已知abc+cba = 1333,其中a,b,c均为一位数,编程求出满足条件的a,b,c所有组合

//5.已知abc+cba = 1333,其中a,b,c均为一位数,编程求出满足条件的a,b,c所有组合 for (int i = 0; i < 10; i++) { for (int j = 0; j < 10; j++) { for (int k = 0; k < 10; k++) { if (i * 100 + j * 10 + k  + i + j * 10 + k * 100 == 1333) { printf("%d %d %d\n",i,j,k); }

Java 可以用已知帐号登录,且可以注册后登录的小程序

|--需求说明 1.写一个注册和登录功能,使用已知的帐号和密码可以直接登录,如果没有帐号,注册后可以用刚注册的帐号登录 2.注册的时候,如果帐号已经存在,不能注册 3.注册的时候,设置两次密码,如果两次密码设置得不同,不能注册 4.登录的时候,密码输错三次,锁定帐号 5.登录的时候,如果没有这个帐号,则提醒用户注册,注册后可以登录 6.登录的时候,帐号密码都正确要输入验证码,系统给出的验证码和用户输入一致时,允许登录(忽略大小写) 7.登录之后,用户可以看到用户的预留信息 |--实现方式 1.采

【Tree】已知前序和中序遍历还原二叉树

1 /************************** 2 https://leetcode.com/problems/construct-binary-tree-from-preorder-and-inorder-traversal/ 3 @date 2015.5.16 4 @description 5 根据前序和中序遍历,重构二叉树 6 可用迭代,也可以使用递归. 7 递归前面已经写过,耗时,这里再次做使用迭代. 8 9 @tags tree, array, depth-first se

已知前序和中序求后序,已知中序和后序求先序。

原文地址:https://www.cnblogs.com/mznsndy/p/11725452.html

编程在一个已知的字符串中查找最长单词,假定字符串中只含字母和空格,用空格来分隔单词。

char str[255] = {0}; printf("请输入一个字符串:\n"); scanf("%[^\n]", str);//意思是非'\n'.也就是说只要没有遇到换行就继续输入,当遇到换行符的时候此语句结束.而默认情况是遇到换行语句执行结束,但是str的值只是第一个空格前的值.但这样写,按回车时scanf执行完,中间所有内容包括空格都会输入到str中去. // gets(str); int maxLength = 0, maxIndex = 0; int

在已知线性表中插入/删除元素的代码

#include "sqlist_h.h" void main(){ SqList L; int n; int e; InitList_Sq(L); cout<<"请输入初始建立线性表的长度n(<=100):"; //printf("请输入初始建立线性表的长度n(<=100):"); cin>>n; //scanf(&n); for(int i=1;i<=n;i++) { cin>>L

codevs:1313 质因数分解:已知正整数 n是两个不同的质数的乘积,试求出较大的那个质数 。

#include<iostream>#include<cstdio>#include<cmath>using namespace std;int a[2];int main(){ int p,b=0; scanf("%d",&p); for(int i=2;i<=p/2;i++) { if(p%i==0) { printf("%d",p/i); return 0; } }}

已知n个正数:wi, 1&lt;=i&lt;=n, 和M。要求找出{wi }的所有子集使得子集内元素之和等于M。例如: n=4, (w1,w2,w3,w4)=(11,13,24,7),M=31 则满足要求的子集是(11,13,7)和(24,7)。

#include<stdio.h> int M,n,i; int x[100]; int w[100]; void SumOfSub(int s, int k, int r)//s:当前和数 k:当前个数 r:总数和 { x[k]=1; if(s+w[k]==M) //子集找到 { printf("子集为:"); for(i=1; i<=k; i++) if(x[i]==1) printf("%d ",w[i]); printf("\n&

已知前序(后序)遍历序列和中序遍历序列构建二叉树(Leetcode相关题目)

1.文字描述: 已知一颗二叉树的前序(后序)遍历序列和中序遍历序列,如何构建这棵二叉树? 以前序为例子: 前序遍历序列:ABCDEF 中序遍历序列:CBDAEF 前序遍历先访问根节点,因此前序遍历序列的第一个字母肯定就是根节点,即A是根节点:然后,由于中序遍历先访问左子树,再访问根节点,最后访问右子树,所以我们找到中序遍历中A的位置,然后A左边的字母就是左子树了,也就是CBD是根节点的左子树:同样的,得到EF为根节点的右子树. 将前序遍历序列分成BCD和EF,分别对左子树和右子树应用同样的方法,

二叉树遍历 已知中序后序遍历求前序遍历

已知中序.后序遍历求前序遍历的方法和已知前序.中序遍历求后序遍历的方法类似寻找根节点, 然后把中序遍历分成左右两个子树,有如此不断递归.很多文章介绍,不再累述. #include <iostream> #include <cstdio> #include <queue> #include <cstring> using namespace std; const int MAXN = 100; struct Node { char value; Node *l