【LeetCode】Construct Binary Tree from (Preorder or Postorder) and Inorder Traversal

本文介绍如何根据给定的先序、中序或后序遍历序列构造二叉树的方法,并提供详细的C++代码示例。重点讲解了递归构建过程中的关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


题目描述

Construct Binary Tree from Preorder and Inorder Traversal
Construct Binary Tree from Inorder and Postorder Traversal

  

Given preorder and inorder traversal of a tree, construct the binary tree.

Given inorder and postorder traversal of a tree, construct the binary tree.

给定先序和中序求后序或者给定后序中序求先序


总结

使用数组一下标效率会高一些
下标的确定一定要正确。
注意返回空的情况。
在vec做参数时需要使用引用,否则系统会复制导致内存溢出

代码示例

class Solution {
public:
    TreeNode *buildTree(vector<int> &inorder, vector<int> &postorder) {
    	int size = inorder.size();
		if(size == 0)  return NULL;
		return buildTreeCore(inorder,0,size - 1,postorder,0,size - 1);
    }
    //vector必须使用传引用,否则每一次递归都会进行一次复制,内存会超出 
    TreeNode *buildTreeCore(vector<int> &inorder,int instart,int inend,vector<int> &postorder,int poststart,int postend)
    {
    	if(poststart > postend)////////////////////////////////!!!!!!!!!!!!!!!!!!!
   			return NULL;
    	TreeNode *root = new TreeNode(postorder[postend]);
    	if(poststart == postend) //这里可以加一个报错,如果最后剩一个如果两个vector中val不一样就错了 
			return root;
			
    	int pos = 0;	
		for(int i = instart;i<=inend;i++)
			if(inorder[i] == postorder[postend])
			{ 
				pos = i;
				break;
			}
	
    	//开始和结束点需要计算清楚 
    	if(pos>instart)
			root->left =  buildTreeCore(inorder,instart,pos-1,postorder,poststart,poststart+(pos-instart)-1);
    	if(inend>pos)
			root->right =  buildTreeCore(inorder,pos+1,inend,postorder,poststart+(pos-instart),postend-1);
		return root;
	}
};
class Solution {
public:
    TreeNode *buildTree(vector<int> &preorder, vector<int> &inorder) {
    	int size = inorder.size();
		if(size == 0)  return NULL;
		return buildTreeCore(preorder,0,size - 1,inorder,0,size - 1);
    }
    //vector必须使用传引用,否则每一次递归都会进行一次复制,内存会超出 
    TreeNode *buildTreeCore(vector<int> &preorder,int prestart,int preend,vector<int> &inorder,int instart,int inend)
    {
    	if(prestart > preend)////////////////////////////////!!!!!!!!!!!!!!!!!!!
   			return NULL;
    	TreeNode *root = new TreeNode(preorder[prestart]);
    	if(prestart == preend) //这里可以加一个报错,如果最后剩一个如果两个vector中val不一样就错了  
			return root;
			
    	int pos = 0;	
		for(int i = instart;i<=inend;i++)
			if(inorder[i] == preorder[prestart])
			{ 
				pos = i;
				break;
			}
    	//开始和结束点需要计算清楚 
    	if(pos>instart)
			root->left =  buildTreeCore(preorder,prestart+1,prestart+(pos-instart),inorder,instart,pos-1);
    	if(inend>pos)
			root->right =  buildTreeCore(preorder,prestart+(pos-instart)+1,preend,inorder,pos+1,inend);
		return root;
	}
};



推荐学习C++的资料

C++标准函数库
在线C++API查询
vector使用方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值