一、654.最大二叉树
题目链接:
学习:
思路:
前序遍历
-
方法参数:(int[] nums, int start, int end)
-
返回类型:TreeNode
-
终止条件:
if(end-start==0) return null; if(end-start==1) return new TreeNode(nums[start]);
-
单层递归逻辑:
- 寻找数组中的最大值,确定根结点,下标为index
- 对nums数组进行切割,找到左子树的范围和右子树的范围,左闭右开
- 递归调用分别返回左孩子和右孩子
二、617.合并二叉树
题目链接:
学习前:
思路:
-
递归:
- 方法参数:(TreeNode root1, TreeNode root2)
- 返回类型:TreeNode
- 终止条件:3种结点为空的情况
- 单层递归逻辑:
- 此时root1和root2均为非空,故根结点的值相加作为新的根结点
- 递归调用分别返回左孩子和右孩子
-
迭代(栈):
- 首先为空判断
if(root1==null) return root2; if(root2==null) return root1; if(root1==null) return root2; else if(root1!=null && root2==null) return root1;
- 此时root1和root2均为非空,入栈值相加,当左右孩子均不为空时,依次入栈
- 返回root1
学习后:
优化了判空条件
if(root1==null) return root2;
if(root2==null) return root1;
三、700.二叉搜索树中的搜索
题目链接:
学习前:
思路:
-
递归:
-
方法参数:(TreeNode root, int val)
-
返回类型:TreeNode
-
终止条件:if(rootnull || root.valval)return root;
-
单层递归逻辑:
val大于当前结点值,返回右子树;val小于当前结点值,返回左子树;val等于当前结点值,返回该结点
-
-
迭代(栈):
-
首先为空判断if(root!=null) stack.push(root);
-
栈不为空的循环,pop当前节点,若val大于当前结点值却右孩子不为空,右孩子入栈;若val小于当前结点值且左孩子不为空,左孩子入栈;val等于当前结点值,返回该结点
-
返回null
-
学习后:
二叉搜索树的特性使得迭代法可以不用额外辅助空间,直接用root进行移动
四、98.验证二叉搜索树
题目链接:
学习后:
思路: 中序遍历
-
递归:
-
方法参数:(TreeNode root)
-
返回类型:boolean
-
终止条件:if(rootnull || root.valval)return root;
-
单层递归逻辑:
-
左:递归调用
-
中:需要一个pre记录前序结点,并且与左子树进行比较
if(pre!=null && root.val<=pre.val) return false; pre=root;
-
右:递归调用
-
-
-
迭代(栈):
-
需要一个pre记录前序结点。在中序遍历迭代方式中,对中的操作修改为
if(pre!=null && pre.val>=cur.val){ return false; } pre=cur;
-
五、学习总结
- 时间:3h
- 二叉搜索树的验证需要采用中序遍历,且要保证左子树的所有结点值小于中结点,且右子树的所有结点值大于根结点