最大二叉树
思路:按题目要求,单层逻辑是先取数组最大值做节点,然后最大值的左边就是左字树,右边就是右子树。如果left>right,则表示叶子节点。
C#代码:
public class Solution {
public TreeNode ConstructMaximumBinaryTree(int[] nums) {
return Construct(nums,0,nums.Length-1);
}
public TreeNode Construct(int[] nums, int left, int right){
if(left > right){return null;}
int best = left;
for(int i=left + 1;i <= right;i++){
if(nums[i]>nums[best]){
best = i;
}
}
TreeNode node = new TreeNode(nums[best]);
node.left = Construct(nums,left,best -1 );
node.right = Construct(nums,best+1,right);
return node;
}
}
合并二叉树
public class Solution {
public TreeNode MergeTrees(TreeNode root1, TreeNode root2) {
if(root1 == null){return root2;}
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;
}
}
//就是两个二叉树一起遍历,都不是null就叠加,root1空就root2取代,反之root2空root1取代
//左子树的循环要两组二叉树的左子树,右子树也是一样的
二叉树搜索中的搜索
代码:
public class Solution {
public TreeNode SearchBST(TreeNode root, int val) {
if(root == null || root.val == val){return root;}
TreeNode node = null;
if(root.val > val){
node = SearchBST(root.left,val);
}
if(root.val < val){
node = SearchBST(root.right,val);
}
return node;
}
}
//主要因为二叉树搜索中的节点是有序的,可以直接判断节点和目标值的大小关系
//如果比目标值大,就搜索左子树;反之搜索右子树
验证二叉树搜索
代码:
public class Solution {
long maxVal = long.MinValue;
public bool IsValidBST(TreeNode root) {
if(root == null){return true;}
bool left = IsValidBST(root.left);
if(maxVal < root.val){maxVal = root.val;}
else return false;
bool right = IsValidBST(root.right);
return left && right;
}
}
//虽然合格二叉树搜索是有序的,不过逻辑不能直接认为直接左边、右边分别和中间比较,
//说不定右子树的左节点还比中间小。然后要用中序遍历去做,左边每次和中间值(动态)
//比较,比中间值大就替换,小就返回false。
文章介绍了在LeetCode中涉及的三种二叉树相关问题:最大二叉树的构建、合并两个二叉树以及在二叉搜索树中进行搜索和验证。通过递归实现展示了如何构造最大值节点并处理左右子树,以及合并两个有序的二叉树结构。
1129

被折叠的 条评论
为什么被折叠?



