先序+中序和中序+后序建树

思路:先序的第一个元素和后序的最后一个元素是当前子树的根,然后遍历中序序列,找到左右子树的分界线,递归建左子树和右子树。

class Solution {
public:
    /*由于是oj,这里假设给的序列是合法的,正常情况是需要判断不合法情况的 */
    TreeNode *buildTree(vector<int> &inorder, vector<int> &postorder,int instart,int inend,int poststart,int postend) {
    	TreeNode* root = new TreeNode(postorder[postend]);
    	if(instart == inend && poststart == postend && instart == poststart)return root;
    	int i;
    	for(i = instart;i <= inend;++i)
    	{
    		if(inorder[i] == postorder[postend])break;//找到中序的根节点
    	}
    	if(i > instart)root -> left = buildTree(inorder,postorder,instart,i - 1,poststart,poststart + (i - instart - 1));
    	if(i < inend) root -> right = buildTree(inorder,postorder,i + 1,inend,poststart + i - instart,postend - 1);
    	return root;
    }
    TreeNode *buildTree(vector<int> &inorder, vector<int> &postorder) {
    	int inlength = inorder.size(),postlength = postorder.size();
    	if( inlength == 0 || inlength != postlength ) return NULL;
    	return buildTree(inorder,postorder,0,inlength-1,0,postlength-1);
    }
};

class Solution {
public:
    TreeNode *buildTree(vector<int>& preorder,vector<int> &inorder,int prestart,int preend,int instart,int inend) {
    	TreeNode* root = new TreeNode(preorder[prestart]);
    	if(instart == inend && prestart == preend && instart == prestart)return root;
    	int i;
    	for(i = instart;i <= inend;++i)
    	{
    		if(inorder[i] == preorder[prestart])break;//找到中序的根节点
    	}
    	if(i > instart)root -> left = buildTree(preorder,inorder,prestart+1,prestart + i - instart,instart,i - 1);
    	if(i < inend) root -> right = buildTree(preorder,inorder,prestart + i - instart + 1,preend,i + 1,inend);
    	return root;
    }
    TreeNode *buildTree(vector<int> &preorder, vector<int> &inorder) {
    	int prelength = preorder.size(),inlength = inorder.size();
    	if( inlength == 0 || inlength != prelength ) return NULL;
    	return buildTree(preorder,inorder,0,prelength-1,0,inlength-1);
    }
};

先序+中序和中序+后序建树,布布扣,bubuko.com

时间: 2024-12-20 12:53:01

先序+中序和中序+后序建树的相关文章

根据二叉树的先序序列和中序序列还原二叉树并打印后序序列

#include<stdio.h> #include<stdlib.h> #include<iostream> using namespace std; struct Node { int value; Node *left; Node *right; Node(int value) { this->value = value; left = right = NULL; } }; bool bNotTree = false; Node* RebuildTree(i

给定二叉树的先序遍历和中序遍历,输出它的后序遍历序列

这里没再用到先申请大Node数组的方法了,想练练写动态内存分配和释放的,一次OK了,也没怎么出错啊,开心~ 方法二 - Code: //给出一个二叉树的先序遍历和中序遍历,输出它的后序遍历 //直接构造的方法白书已给出.这里是先递归构造二叉树,然后进行后序遍历. #include<stdio.h> #include<string.h> #include<stdlib.h> #define MAXN 1000 typedef struct node { char data

“中序表达式”转换为“前序表达式”、“后序表达式”

首先看下面所示表格: 中序表达式 2*3/(2-1)+3*(4-1) 前序表达式 +/*23-21*3-41 后序表达式 23*21-/341-*+ 中序表达式对我们而言是很直观的(我们平时接触的就是这个),但计算机处理起来比较麻烦(括号.优先级之类的),前序和后序表达式中没有括号,而且在计算中只需单向扫描,不需要考虑运算符的优先级. 以前序表达式“+/*23-21*3-41”为例,从右往左,先取出两个操作数“1”.“4”和一个运算符“-”,计算“4-1”,将结果3回填到字符串中,现在字符串变为

[无需建树]已知前序或后序和中序遍历结果,输出前序或后序或层次遍历的方法汇总

最近刷PAT老是碰到这种憨批题目,这种题目在算法面试中也是常客了,主要分为4类 已知前序 中序,求后序 已知前序 中序,求层次 已知后序 中序,求前序 已知前序 中序,求层次 而这四种题目如果要做出来的话,通通不需要建树,因为建树也是按照一定的递归顺序来的,就算是层次遍历,也可以在递归途中保存一些信息来获得. 我们先给出一颗二叉树 可以得到以下信息 前序:4,1,3,2,6,5,7 中序:1,2,3,4,5,6,7 后序:2,3,1,5,7,6,4 层次:4,1,6,3,5,7,2 前序&中序-

二叉查找树中由前序转化为后序

1 void getPostFromPre(int preL, int preR) { 2 if (preL > preR) return; 3 int i = preL + 1, j = preR; 4 while (i <= preR && pre[i] < pre[preL]) i++; 5 while (j > preL&&pre[j] >= pre[preL]) j--; 6 7 if (i - j != 1) return; 8 g

C语言递归实现二叉树的先序、中序、后序遍历

#include <stdio.h> #include <stdlib.h> //*****二叉树的二叉链表存储表示*****// typedef struct BiNode { char data; struct BiNode *lchild, *rchild; }BiNode, *BiTree; //*****按先序次序输入二叉树中结点的值(一个字符),空格字符表示空树构造二叉链表表示的二叉树T*****// void CreateBiTree(BiTree &T) {

c++树,知道前序和中序求后序遍历

经常有面试题就是知道一棵树的前序遍历和中序遍历让你写出后序遍历,这个慢慢画是能画出来的,但是要很快的弄出来还是要懂原理. 首先说一下三种遍历:所谓的前序后序和中序都是遍历时遍历根节点的顺序.子树的话依照从做左到右的顺序,比如前序就是:中->左->右,中序就是:左->中->右. 现在前序是:ABDGCEFH 中序是:DGBAECHF 想要求后序就要把树重建出来,我们理一下思路. 1.由前序遍历的性质可以知道A必然是树的根节点 2.中序遍历中A之前的就肯定是A的左子树,A后面的就是A的

二叉树的前序中序后序遍历相互求法

二叉树的前中后序遍历,他们的递归非递归.还有广度遍历,参见二叉树的前中后序遍历迭代&广度遍历和二叉树的前中后序遍历简单的递归 现在记录已知二叉树的前序中序后序遍历的两个,求另外一个.一般,这两个中一定有中序遍历. 1.已知前序和中序,求后序遍历: 前序:ABDECFG  中序:DBEAFCG 思路简单:前序的第一个节点就是根节点, 中序中找到根节点的位置,根节点之前是其左子树,之后是右子树   按此顺序,依次在左子树部分遍历,右子树部分遍历 C++ 代码: TreeNode *BinaryTre

二叉树的遍历方法之层序-先序-中序-后序遍历的简单讲解和代码示例

二叉树的基础性质及二叉树的建立参见前面两篇博文: http://blog.csdn.net/why850901938/article/details/51052936 http://blog.csdn.net/why850901938/article/details/51052156 首先为了讲解方便,我建立了如图所示的二叉树: 取名为:树A 1.何为层序遍历? 层序遍历就是按照二叉树的层次由上到下的进行遍历,每一层要求访问的顺序为从左到右: 以树A为例,层序遍历得到的结果为: 5 2 6 1