【LeetCode】构造二叉树

构造二叉树有两种办法

  1. 前序+中序
  2. 后序+中序
    这两种方法的思路是相同的,都是用前序(第一个元素)或者后序(最后一个元素)来对中序数组进行划分成左右数组,再根据划分的中序数组的大小来划分前序/后序数组。

由于需要不断的进行划分,我们首先想到的是递归的办法

  • 递归的返回值一定是TreeNode型的,因为需要根据新建的结点构建二叉树;
  • 递归的参数列表有对数组的引用,有前序/后序的起始和终止,有中序的起止和终止;
  • 递归的主体部分是对数组的划分;再进行root->left和root->right 的递归求值;

106. 从中序与后序遍历序列构造二叉树

106. 从中序与后序遍历序列构造二叉树
根据一棵树的中序遍历与后序遍历构造二叉树。

注意:
你可以假设树中没有重复的元素。

例如,给出
中序遍历 inorder = [9,3,15,20,7]
后序遍历 postorder = [9,15,7,20,3]
返回如下的二叉树:

    3
   / \
  9  20
    /  \
   15   7
通过次数72,987提交次数103,285
TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
   
		if(inorder.size()==0||postorder.size()==0) return NULL;
		return traversal(inorder,0,inorder.size(),postorder,0,postorder.size());
}
TreeNode* traversal(vector<int>& inorder,int inorderbegin,int inorderend,vector<int>& postorder,int postorderbegin,int postorderend){
   
		//终止条件,当后序数组大小为0的时候,返回NULL
		 if(postorderbegin==postorderend) return NULL;
		 //当后序数组的大小不为0的时候找到新的划分值
		 int rootvalue=postorder[postorderend-1];
		 TreeNode* root=new TreeNode(rootvalue);
		 if(postorderbegin-postorderend==1) return root;
		 //在中序数组中划分
		 int delemiter;
		 for(delemiter=inorderbegin;delemiter<inorderend;delemiter++){
   
			if(inorder[delemiter]==rootvalue) break;		
		 }
		 //中序划分为两部分,分别为 leftInorderBegin-leftInorderEnd  rightInorderBegin-rightInorderEnd
		 int leftinorderbegin=inorderbegin;
		 int leftinorderend=delemiter;
		 int rightinorderbegin=delemiter+1;
		 int rightinorderend=inorderend;
			
		 //划分后序数组为两部分,分别为 leftPostorderBegin-leftPostorderEnd  rightPostorderBegin-rightPostorderEnd
		 int leftpostorderbegin

你可能感兴趣的:(LeetCodes解题)