算法笔记|Day15二叉树V
☆☆☆☆☆leetcode 654.最大二叉树
题目链接:leetcode 654.最大二叉树
题目分析
递归,采用前序遍历,构造中间节点,然后递归构造左子树和右子树。用数组构造二叉树,每次分隔通过下标索引直接在原数组上操作,这样可以节约时间和空间上的开销。
代码
class Solution {
public TreeNode constructMaximumBinaryTree(int[] nums) {
return construct(nums,0,nums.length);
}
public TreeNode construct(int nums[],int left,int right){
if(right-left<1)
return null;
if(right-left==1)
return new TreeNode(nums[left]);
int maxIndex=left;
int maxVal=nums[maxIndex];
for(int i=left;i<right;i++){
if(nums[i]>maxVal){
maxVal=nums[i];
maxIndex=i;
}
}
TreeNode root=new TreeNode(maxVal);
root.left=construct(nums,left,maxIndex);
root.right=construct(nums,maxIndex+1,right);
return root;
}
}
提示:根据maxIndex划分左右子树。
☆☆☆☆☆leetcode 617.合并二叉树
题目链接:leetcode 617.合并二叉树
题目分析
递归,采用前序、中序、后序遍历均可,前序遍历更符合理解的逻辑。
代码
class Solution {
public TreeNode mergeTrees(TreeNode root1, TreeNode root2) {
TreeNode root=new TreeNode();
if(root1==null)
return root2;
if(root2==null)
return root1;
root.val=root1.val+root2.val;
root.left=mergeTrees(root1.left,root2.left);
root.right=mergeTrees(root1.right,root2.right);
return root;
}
}
提示:新建root,没有在root1和root2上直接做修改。
☆☆☆☆☆leetcode 700.二叉搜索树中的搜索
题目分析
二叉搜索树自带顺序,采用递归无需考虑前序、中序、后序遍历,另外可以使用迭代法层序遍历,根据平衡二叉树的特性判断向左还是向右迭代。
代码
1.递归
class Solution {
public TreeNode searchBST(TreeNode root, int val) {
if(root==null||root.val==val)
return root;
if(root.val<val)
return searchBST(root.right,val);
if(root.val>val)
return searchBST(root.left,val);
return null;
}
}
2.迭代
class Solution {
public TreeNode searchBST(TreeNode root, int val) {
while(root!=null){
if(root.val<val)
root=root.right;
else if(root.val>val)
root=root.left;
else
return root;
}
return null;
}
}
☆☆☆☆☆leetcode 98.验证二叉搜索树
题目链接:leetcode 98.验证二叉搜索树
题目分析
若采用中序遍历,可以把二叉树转换为一个数组,只需判断这个数组是否为有序数组。这里采用递归,用中序遍历,并用pre指针表示上一个节点,依次判断。
代码
class Solution {
TreeNode pre;
public boolean isValidBST(TreeNode root) {
if(root==null)
return true;
if(isValidBST(root.left)==false)
return false;
if(pre!=null&&pre.val>=root.val)
return false;
pre=root;
return isValidBST(root.right);
}
}