654.最大二叉树
题目链接:. - 力扣(LeetCode)
思路:在数组中找最大的值作为根节点,左右子树照着递归
public TreeNode build(int[] nums,int begin,int end) {
if(end == begin) return null;
int idx = findMax(nums);
int root = nums[idx];
TreeNode rootnode = new TreeNode(root);
if(end - begin == 1) return rootnode;
List<int[]> list = partition(nums);
int leftBegin = begin;
int leftEnd = begin + idx;
int rightBegin = begin + idx + 1;
int rightEnd = end;
rootnode.left = build(list.get(0),leftBegin,leftEnd);
rootnode.right = build(list.get(1),rightBegin,rightEnd);
return rootnode;
}
617.合并二叉树
题目链接:. - 力扣(LeetCode)
思路:弄到两个二叉树的并集
我用递归:
- 参数和返回值:返回值为结点,参数为两棵树的同一位置结点
- 终止条件:root1 和root2 都为空就返回null
- 单层逻辑:root1 ,root2有一个为空就把他变成0;这个位置的node就为root1+root2;推卸责任,node的左孩子就是root1的左孩子 + root2的左孩子,右孩子同理;最后返回node;
public TreeNode merge(TreeNode root1,TreeNode root2) {
if(root1 == null && root2 == null)return null;
if(root1 == null) root1 = new TreeNode(0);
if(root2 == null) root2 = new TreeNode(0);
TreeNode root = new TreeNode(root1.val + root2.val);
root.left = merge(root1.left,root2.left);
root.right = merge(root1.right,root2.right);
return root;
}
700.二叉搜索树中的搜索
题目链接:. - 力扣(LeetCode)
思路:肯定要用到二叉树搜索树都性质,所有左子树都小于根节点,右子树大于结点
递归实现:
- 参数和返回值:返回值为结点(要找到那个结点),参数为node和目标值
- 终止条件为:结点为空返回空,结点val为目标值就返回结点;
- 单层逻辑:如果结点值小于目标值就推责任给右孩子,大于目标值就推给左孩子;最后返回左右孩子里面不为空的那个,都为空就返回空
public TreeNode search(TreeNode node,int val) {
// if(node.left == null && node.right == null && node.val != val) {
// return null;
// }
if(node == null)return null;
if(node.val == val) return node;
TreeNode a = null;
TreeNode b = null;
if(node.val < val) {
if(node.right != null)
a = search(node.right,val);
}else {
if(node.left != null)
b = search(node.left,val);
}
// if(node.left != null) a= search(node.left,val);
// if(node.right != null) b = search(node.right,val);
return a == null ? b : a;
}
98.验证二叉搜索树
题目链接:. - 力扣(LeetCode)
思路:考察二叉搜索树都性质,二叉搜索树按照中序遍历为一个递增的序列
验证一个二叉树是否为二叉搜索树也需要中序遍历展开,过程中看是否满足递增
可以用递归法:
递归三部曲:
- 返回值和参数,返回值为布尔表示这个是否是二叉搜索树(过程中是否出现不满足的情况,不递增了),参数为结点
- 终止条件为:结点为空,返回true;
- 单层逻辑是:要进行中序遍历,先推卸给左孩子,在处理中结点,如果中结点不满足递增就返回false;再推给右孩子;返回左&&右;
递归法
public boolean isValid(TreeNode node) {
if(node == null) return true;
boolean left = isValid(node.left);//左
if(pre != null && pre.val >= node.val)return false;
pre = node;
boolean right = isValid(node.right);
return left && right;
}
也可以用迭代法,用栈实现中序遍历
Deque<TreeNode> deque = new LinkedList<>();
if(root == null) return true;
TreeNode cur = root;
while(cur != null || !deque.isEmpty()) {
if(cur != null) {
deque.push(cur);
cur = cur.left;//左
}else {
cur = deque.pop();//中
if(pre != null && pre.val >= cur.val)return false;
pre = cur;
cur = cur.right;//右
}
}
return true;