根据前序遍历和中序遍历重建二叉树
来源:互联网 发布:mysql join as 编辑:程序博客网 时间:2024/05/16 05:20
1. 非递归方式
/**
* Definition for binary tree
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> vin) {
TreeNode* head=new TreeNode(pre[0]);//前序遍历的第一个元素一定是根
//对于每个pre中的元素,如果他的下一个元素在vin中位于他的左边,就是他的左孩子;
//如果在vin中位于他的右边,就是他的右孩子
int size=pre.size();
TreeNode* cur=head;
TreeNode* left;
TreeNode* right;
TreeNode* temp;
stack<TreeNode*> s;
s.push(cur);
for(int i=1;i<size;i++){
if(decideleft(vin,pre[i],cur->val)){
left=new TreeNode(pre[i]);
cur->left=left;
cur=left;
s.push(cur);
}else{
s.pop();
while(!s.empty()){
temp=s.top();
if(decideleft(vin,pre[i],temp->val)){
right=new TreeNode(pre[i]);
cur->right=right;
cur=right;
s.push(cur);
break;
}else{
cur=s.top();
s.pop();
}
}
if(s.empty()){
right=new TreeNode(pre[i]);
cur->right=right;
cur=right;
s.push(cur);
}
}
}
return head;
}
bool decideleft(vector<int>& vin,int temp,int root){
//判断temp在root的左边吗?是返回true
int size=vin.size();
bool flag;
for(int i=0;i<size;i++){
if(vin[i]!=temp&&vin[i]!=root)
continue;
else if(vin[i]==temp){
flag= true;
break;
}else{
flag= false;
break;
}
}
return flag;
}
};
2. 递归方式
利用递归的方式进行二叉树重建的时候,需要注意的就是在中序遍历序列中找到分界点的时候,需要立刻计算出分界点左边的节点的数量,左边节点的数量就是分界点左子树中
节点的总数量;分界点右边的节点的数量,就是分界点右子树中节点的数量。利用这些数量,可以在前序遍历中找到分界点的右子树中的节点起始位置。
/**
* Definition for binary tree
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> vin) {
int size=vin.size();
TreeNode* head=rebuild(0,0,size-1, pre, vin);
return head;
}
TreeNode* rebuild(int preindex,int vinstart,int vinend,vector<int>& pre,vector<int>& vin){
TreeNode* head=new TreeNode(pre[preindex]);
if(vinstart>=vinend)
return head;
int i;
for( i=vinstart;i<=vinend;i++){
if(pre[preindex]==vin[i])
break;
}
int leftnum=i-vinstart;//这里计算分界点左边的节点数量是非常重要的,利用这个数量可以找到建立右子树时的preindex!!!!
int rightnum=vinend-i;
if(leftnum>0)
head->left=rebuild(preindex+1,vinstart,vinstart+leftnum-1, pre,vin);
if(rightnum>0)
head->right=rebuild(preindex+leftnum+1,vinstart+leftnum+1, vinend,pre,vin);
return head;
}
};
- 根据中序和前序遍历重建二叉树
- 根据前序和中序遍历重建二叉树
- 根据前序遍历、中序遍历重建二叉树
- 根据二叉树的前序遍历和中序遍历重建二叉树
- 根据二叉树的前序遍历和中序遍历的结果,重建二叉树
- 重建二叉树---根据前序和中序遍历结果重建二叉树
- 根据前序遍历和中序遍历重建二叉树的Java实现
- (剑指offer笔记)根据前序遍历和中序遍历重建二叉树
- 027根据前序遍历和中序遍历,重建二叉树(keep it up)
- 根据前序遍历序列和中序遍历序列重建二叉树
- 根据前序遍历和中序遍历重建二叉树
- 面试题6:重建二叉树(根据前序遍历和中序遍历)
- 剑指Offer_06 根据前序遍历和中序遍历序列 重建二叉树
- 根据前序遍历序列和中序遍历序列重建二叉树
- 根据前序遍历和中序遍历结果重建二叉树(递归方法)
- 根据前序遍历和中序遍历重建二叉树
- 根据前序遍历和中序遍历重建二叉树
- 如何根据前序遍历和中序遍历重建二叉树
- Hello world
- LCD驱动程序——框架分析(一)
- [分布式监控CAT] Server端源码解析——初始化
- Retrofit+Rxjava乞丐封装
- java开发手册(强大的阿里巴巴)
- 根据前序遍历和中序遍历重建二叉树
- ssh_两台互不信任的主机如何通过一台信任的主机传输数据
- 前后端分离,ajax前端跨域访问后端
- oracle+mybatis的批量操作
- 三、用eclipse第一个程序
- 把一行里 ‘,’ 隔开的数据一行转换成多行
- 修改host文件访问Google等一些国外网站
- C语言程序内存分配中的堆和栈
- 网站打开速度慢的原因