代码随想录算法训练营第二十天|654.最大二叉树、617.合并二叉树、700.二叉搜索树中的搜索、98.验证二叉搜索树

654.最大二叉树

递归法:

public class Solution {
    public TreeNode ConstructMaximumBinaryTree(int[] nums) {
        var max=int.MinValue;
        var index=0;
        if(nums.Length==0)
        {
            return null;
        }
        for(int i=0;imax)
            {
                max=nums[i];
                index=i;
            }
        }
        var root=new TreeNode(max,null,null);
        root.left=ConstructMaximumBinaryTree(nums.Take(index).ToArray());
         root.right=ConstructMaximumBinaryTree(nums.Skip(index+1).ToArray());
        return root;
    }
}

首先排除数组为0的情况,然后遍历数组找出最大值的索引Index,然后以数组最大值创建一个新的根节点并作为值,然后用迭代对Index左边的数组找到左子树,Index右边的数组找到右子树。

617.合并二叉树

递归法:

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;
    }
}

如果数一为空则补上数二节点,如果数二为空则补上数一节点,然后当前节点值为数一数二对应值相加,然后递归左节点和右节点,最终结束返回数一根节点。

700.二叉搜索树中的

层序遍历法:

public class Solution {
    public TreeNode SearchBST(TreeNode root, int val) {
        var q=new Queue();
        if(root==null)
        {
            return null;
        }
        q.Enqueue(root);
        while(q.Count!=0)
        {
            var size=q.Count;
            while(size!=0)
            {
                size--;
                var cur=q.Dequeue();
                if(cur.val==val)
                {
                    return cur;
                }
                if(cur.left!=null)
                {
                    q.Enqueue(cur.left);
                }
                if(cur.right!=null)
                {
                    q.Enqueue(cur.right);
                }
            }
        }
        return null;
    }
}

层序遍历找到该节点的值为目标值时直接返回当前节点,否则返回空。

递归法:

public class Solution {
    public TreeNode SearchBST(TreeNode root, int val) {
        if(root==null)
        {
            return null;
        }
        if(root.val==val)
        {
        return root;
        }
        TreeNode ans=null;
        ans=root.val>val?SearchBST(root.left,val):SearchBST(root.right,val);
        return ans;
    }
}

根节点为空直接返回空,当前节点如果等于目标值返回当前节点,由于搜索数特效,如果目标值大于当前节点值我们去当天节点向右递归否则向左递归去找目标值。

98.验证二叉搜索树

递归法:

public class Solution {
    public bool IsValidBST(TreeNode root) {
       long long maxVal = LONG_MIN;
    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;
}
}

先声明一个最小值来储存较大值,如果根节点为空直接返回True,我们按照左中右的顺序,如果当前左节点的值小于中节点的值就将中节点的值给MaxVal否则直接不满足,然后继续向右执行同样的操作。最终返回左边递归结果和右边递归结果取与。

你可能感兴趣的:(算法,java,leetcode,c#,数据结构)