在构造二叉树中,有一类典型的题目需要拿出来单独说说,那就是从数组到二叉树的分割构造。
最典型的是使用中序和后序构造二叉树这类题目。
我们先从分割的思路开始
构造最大二叉树
给定一个数组,用最大值作为根节点创建一棵树,然后递归的将左边的值构建左子树,右边的值构建右子树。
这里使用的分割思想也是后面构建二叉树的关键。
我们在给定数组中找到最大值,构建根节点,然后再递归左右两边即可。
左右两边也是找最大值,构建子树的根节点,以此类推。
既然要递归,那么需要一个辅助函数用来确定边界。
TreeNode* traverse(vector<int>& nums,int low,int high)
low和high就是每次递归的边界。
TreeNode* traverse(vector<int>& nums,int low,int high){//分割
if(low>high)
return NULL;
int index=-1;
int maxval=INT32_MIN;
for(int i=low;i<=high;i++){//找到最大值,获取下标
if(maxval<nums[i]){
maxval=nums[i];
index=i;
}
}
TreeNode* root=new TreeNode(maxval);
root->left=traverse(nums,low,index-1);//通过下标分割
root->right=traverse(nums,index+1,high);//通过下标分割
return root;
}
通过遍历构造二叉树
这类题目有三道最为经典:
前序与中序构造二叉树
中序与后序构造二叉树
前序与后序构造二叉树
掌握一道题的精髓基本就掌握了其他题目
前序与中序构造二叉树
给定前序数组和中序数组,构造出这棵二叉树
preorder = [3,9,20,15,7], inorder = [9,3,15,20,7]
我们知道前序遍历先遍历的是根节点,在得到根节点后,就可以根据中序遍历将数组左右拆分得到左右子树。
所以对于辅助函数来说,除了两个数组外,我们还需要四个标志来确定边界。