LeetCode 654.最大二叉树
题目链接:https://leetcode.cn/problems/maximum-binary-tree/description/
文章链接:https://programmercarl.com/0513.%E6%89%BE%E6%A0%91%E5%B7%A6%E4%B8%8B%E8%A7%92%E7%9A%84%E5%80%BC.html
思路
构造树一般采用的是前序遍历,因为先构造中间节点,然后递归构造左子树和右子树。
1、确定递归函数的参数和返回值
参数传入的是存放元素的数组,返回该数组构造的二叉树的头结点,返回类型是指向节点的指针。
2、确定终止条件
题目中说了输入的数组大小一定是大于等于1的,所以我们不用考虑小于1的情况,那么当递归遍历的时候,如果传入的数组大小为1,说明遍历到了叶子节点了。
那么应该定义一个新的节点,并把这个数组的数值赋给新的节点,然后返回这个节点。 这表示一个数组大小是1的时候,构造了一个新的节点,并返回。
3、确定单层递归的逻辑
这里有三步工作
- 先要找到数组中最大的值和对应的下标, 最大的值构造根节点,下标用来下一步分割数组。
- 最大值所在的下标左区间 构造左子树
这里要判断maxValueIndex > 0,因为要保证左区间至少有一个数值。 - 最大值所在的下标右区间 构造右子树 判断maxValueIndex < (nums.size() - 1),确保右区间至少有一个数值。
public TreeNode constructMaximumBinaryTree(int[] nums) {
return traversal(nums,0,nums.length);
}
public TreeNode traversal(int[] nums, int left, int right) {
if (nums.length == 1)
return new TreeNode(nums[0]);
// 寻找数组中的最大值
int maxValue = 0;
int index = left;
for (int i = left; i < right; i++) {
if (nums[i] > maxValue) {
maxValue = nums[i];
index = i;
}
}
TreeNode root = new TreeNode(maxValue);
if (index > left)
root.left = traversal(nums, left, index);
if (index < right - 1)
root.right = traversal(nums, index + 1, right);
return root;
}
LeetCode 617.合并二叉树
题目链接:https://leetcode.cn/problems/merge-two-binary-trees/description/
文章链接:https://programmercarl.com/0617.%E5%90%88%E5%B9%B6%E4%BA%8C%E5%8F%89%E6%A0%91.html
思路
1、确定递归函数的参数和返回值:
首先要合入两个二叉树,那么参数至少是要传入两个二叉树的根节点,返回值就是合并之后二叉树的根节点。
2、确定终止条件:
因为是传入了两个树,那么就有两个树遍历的节点t1 和 t2,如果t1 == NULL 了,两个树合并就应该是 t2 了(如果t2也为NULL也无所谓,合并之后就是NULL)。反过来如果t2 == NULL,那么两个数合并就是t1(如果t1也为NULL也无所谓,合并之后就是NULL)。
3、确定单层递归的逻辑:
单层递归的逻辑就比较好写了,这里我们重复利用一下t1这个树,t1就是合并之后树的根节点(就是修改了原来树的结构)。
public TreeNode mergeTrees(TreeNode root1, TreeNode root2) {
// 若root1为空,说明应该合并之后只有root2
if (root1 == null)
return root2;
// 若root2为空,说明应该合并之后只有root1
if (root2 == null)
return root1;
// 若都不为空,则相加
root1.val += root2.val;
root1.left = mergeTrees(root1.left, root2.left);
root1.right = mergeTrees(root1.right,root2.right);
return root1;
}
LeetCode 700.二叉搜索树中的搜索
题目链接:https://leetcode.cn/problems/search-in-a-binary-search-tree/description/
文章链接:https://programmercarl.com/0700.%E4%BA%8C%E5%8F%89%E6%90%9C%E7%B4%A2%E6%A0%91%E4%B8%AD%E7%9A%84%E6%90%9C%E7%B4%A2.html#%E7%AE%97%E6%B3%95%E5%85%AC%E5%BC%80%E8%AF%BE
public TreeNode searchBST(TreeNode root, int val) {
if (root == null)
return null;
if (root.val == val)
return root;
else if (val < root.val)
return searchBST(root.left, val);
else return searchBST(root.right, val);
}
LeetCode 98.验证二叉搜索树
题目链接:https://leetcode.cn/problems/validate-binary-search-tree/description/
文章链接:https://programmercarl.com/0098.%E9%AA%8C%E8%AF%81%E4%BA%8C%E5%8F%89%E6%90%9C%E7%B4%A2%E6%A0%91.html
思路
1、确定递归函数,返回值以及参数
要定义一个longlong的全局变量,用来比较遍历的节点是否有序,因为后台测试数据中有int最小值,所以定义为longlong的类型,初始化为longlong最小值。
注意递归函数要有bool类型的返回值, 我们在二叉树:递归函数究竟什么时候需要返回值,什么时候不要返回值?只有寻找某一条边(或者一个节点)的时候,递归函数会有bool类型的返回值。
其实本题是同样的道理,我们在寻找一个不符合条件的节点,如果没有找到这个节点就遍历了整个树,如果找到不符合的节点了,立刻返回。
2、确定终止条件
如果是空节点,返回true,因为空树也是一个二叉排序树
3、确定单层递归的逻辑
中序遍历,一直更新maxVal,一旦发现maxVal >= root->val,就返回false,注意元素相同时候也要返回false。
// maxValue用来记录中序遍历下上一个节点的值
private long maxValue = Long.MIN_VALUE;
public boolean isValidBST(TreeNode root) {
if (root == null)
return true;
boolean l = isValidBST(root.left);
if (maxValue < root.val)
maxValue = root.val;
else
return false;
boolean r = isValidBST(root.right);
return l&&r;
}