今天结束二叉树题目,感觉最二叉树的属性及操作更深刻了。
1.力扣669(修建二叉搜索树)
本题是给出范围,也就是二叉搜索树根据这个范围来除去不符合的节点,又因为本题是二叉搜索树所以使用中序遍历,若遍历到不符合范围的节点时,直接跳过本节点并递归遍历。下面时递归三部曲:
- 确定递归函数的参数以及返回值:我们需要返回根节点,所以本题我们返回节点。
public TreeNode trim(TreeNode root, int low, int high)
- 确定终止条件:修剪的操作并不是在终止条件上进行的,所以就是遇到空节点返回就可以了。
if(root==null){
return null;
}
- 确定单层递归的逻辑:如果root(当前节点)的元素小于low的数值,那么应该递归右子树,并返回右子树符合条件的头结点;有边界同理。
if(root.val<low){
return trim(root.right,low,high);
}
if(root.val>high){
return trim(root.left,low,high);
}
root.left = trim(root.left,low,high);
root.right = trim(root.right,low,high);
return root;
整体代码如下:
public TreeNode trimBST(TreeNode root, int low, int high) {
return trim(root,low,high);
}
public TreeNode trim(TreeNode root, int low, int high) {
if(root==null){
return null;
}
if(root.val<low){
return trim(root.right,low,high);
}
if(root.val>high){
return trim(root.left,low,high);
}
root.left = trim(root.left,low,high);
root.right = trim(root.right,low,high);
return root;
}
2.力扣108(将有序数组转为二叉搜索树)
本题需要我们构建二叉树,所以我们采用前序遍历,构建好根节点后,我们递归遍历二叉树;本题有个特殊的地方,我们需要构建出高度平衡的二叉树,所以我们这里取得时数组得中间值,这样可以保证构建出来得节点高度不可能超过一。下面是递归三部曲:
- 确定递归函数返回值及其参数:首先是传入数组,然后就是左下标left和右下标right,在构造二叉树的时候尽量不要重新定义左右区间数组,而是用下标来操作原数组。
public TreeNode sorted(int[] nums,int left,int right)
- 确定递归终止条件:这里定义的是左闭右闭的区间,所以当区间 left > right的时候,就是空节点了。
if(left>right){
return null;
}
- 确定单层递归的逻辑:我们取mid = (right+left)/2,也就是数组长度为奇数取中间值,为偶数时,我们取左边得值。然后再递归构建左右子树。
int mid = (left+right)/2;
TreeNode node = new TreeNode(nums[mid]);
node.left = sorted(nums,left,mid-1);
node.right = sorted(nums,mid+1,right);
return node;
整体代码:
public TreeNode sortedArrayToBST(int[] nums) {
return sorted(nums,0,nums.length-1);
}
public TreeNode sorted(int[] nums,int left,int right) {
if(left>right){
return null;
}
int mid = (left+right)/2;
TreeNode node = new TreeNode(nums[mid]);
node.left = sorted(nums,left,mid-1);
node.right = sorted(nums,mid+1,right);
return node;
}
3.力扣538(把二叉搜索树转为累加树)
本题利用双指针来解决可以充分利用二叉搜索树的特性,因为我们要求累加树,我们先遍历右中左的遍历顺序会非常好解决,当我们遍历至二叉树的最右端时,我们重新赋值节点的值为pre+root.val,然后记录pre的值。下面时递归三部曲:
- 递归函数参数以及返回值:这里很明确了,不需要递归函数的返回值做什么操作了,要遍历整棵树。同时需要定义一个全局变量pre,用来保存cur节点的前一个节点的数值,定义为int型就可以了。
public TreeNode convert(TreeNode root)
- 确定终止条件:遇空就终止。
if(root==null){
return null;
}
- 确定单层递归的逻辑:注意要右中左来遍历二叉树, 中节点的处理逻辑就是让cur的数值加上前一个节点的数值。
convert(root.right);
root.val+=pre;
pre = root.val;
convert(root.left);
return root;
整体代码:
int pre = 0;
public TreeNode convertBST(TreeNode root) {
return convert(root);
}
public TreeNode convert(TreeNode root) {
if(root==null){
return null;
}
convert(root.right);
root.val+=pre;
pre = root.val;
convert(root.left);
return root;
}
附上大佬的二叉树的总结图: