代码随想录算法训练营第二十三天|LeetCode669,108,538
669. 修剪二叉搜索树
通过本题可以了解到:涉及二叉树节点的插入,删除。递归函数的返回值均可以为TreeNode,方便节点的操作
确定递归函数的参数以及返回值
通过递归函数的返回值来移除节点。
确定终止条件
修剪的操作并不是在终止条件上进行的,所以就是遇到空节点返回就可以了。
确定单层递归的逻辑
如果root(当前节点)的元素小于low的数值,那么应该递归右子树,并返回右子树符合条件的头结点。
如果root(当前节点)的元素大于high的,那么应该递归左子树,并返回左子树符合条件的头结点。
接下来要将下一层处理完左子树的结果赋给root->left,处理完右子树的结果赋给root->right。
public TreeNode trimBST(TreeNode root, int low, int high) {
if (root == null){
return root;
}
if (root.val>high){
//这里就删除了不符合条件的节点。
return trimBST(root.left,low,high);
}
if (root.val<low){
return trimBST(root.right,low,high);
}
if (root.val <= high&&root.val>=low){
root.left = trimBST(root.left,low,high);
root.right = trimBST(root.right,low,high);
}
return root;
}
108.将有序数组转换为二叉搜索树
递归三部曲:
1.确定返回值以及参数
构造一颗二叉树可以认为是不断向二叉树中添加节点,所以可以利用返回值来添加节点
2.确定递归返回条件
设计区间的循环不变量,本题采用 前闭后开 的定义方式。所以判断条件为right>left
3.确定循环逻辑:
取了中间位置,就开始以中间位置的元素构造节点,代码:TreeNode* root = new TreeNode(nums[mid]);
。
接着划分区间,root的左孩子接住下一层左区间的构造节点,右孩子接住下一层右区间构造的节点。
public TreeNode sortedArrayToBST(int[] nums) {
return findNode(nums,0, nums.length);
}
public TreeNode findNode(int[] nums, int start, int end){
if (start >= end){
return null;
}
//获取当前数组的中间节点,注意越界问题
int mid = start + (end - start) / 2;
TreeNode node = new TreeNode(nums[mid]);
node.left = findNode(nums, start, mid);
node.right = findNode(nums, mid+1, end);
return node;
}
538.把二叉搜索树转换为累加树
从树中可以看出累加的顺序是右中左,所以我们需要反中序遍历这个二叉树,然后顺序累加就可以了。
Integer pre = 0;
public void traversal(TreeNode node){
if (node == null){
return;
}
traversal(node.right);
node.val = node.val + pre;
pre = node.val;
traversal(node.left);
}
public TreeNode convertBST(TreeNode root) {
traversal(root);
return root;
}