leetcode二叉搜索树相关:将有序数组转换二叉搜索树+将有序链表转换二叉搜索树+检查平衡性+合法二叉搜索树+二叉树的最近公共祖先

1.将有序数组转换二叉搜索树

中序遍历二叉树:若二叉树为空,则空操作,否则①中序遍历左子树;②访问根节点;③中序遍历右子树。我们可以明确该问题的子问题是:构造树的每个节点以及该节点的左右子树。递归结束的条件是:当输入的递增数组为空时即左下标大于了右下标,只能构成一棵空树,此时返回空节点(空指针)。当构造节点的左右子树时,对递增数组进行拆分并进行递归调用。

众所周知,一棵二叉搜索树是一棵有根二叉树并且对于所有节点满足特殊的性质:对于树中任意一个点,它的权值必然 ≥ 所有左子树节点的权值,≤ 所有右子树节点的权值。因为二叉树具有递归的子结构,二叉搜索树也同理:所有子树也是二叉搜索树。还要求根节点的值大于其左子树中任意一个节点的值,小于其右子树中任意一节点的值。

class Solution {
public:
TreeNode* sortedArrayToBST(vector<int>& nums){
    return helper(nums,0,nums.size()-1);
}
TreeNode* helper(vector<int>& nums,int left,int right){
    if(left>right) return nullptr;
    int mid=(left+right+1)/2;
    TreeNode* root=new TreeNode(nums[mid]);
    root->left=helper(nums,left,mid-1);
    root->right=helper(nums,mid+1,right);
    return root;
}
};

2.将有序链表转换二叉搜索树

3.检查平衡性

类的成员函数是指那些把定义和原型写在类定义内部的函数,就像类定义中的其他变量一样。类成员函数是类的一个成员,它可以操作类的任意对象,可以访问对象中的所有成员。平衡树的定义如下:任意一个节点,其两棵子树的高度差不超过 1。

class Solution {
public:
    int getheight(TreeNode* root){
    if(root==NULL) return 0;
    else return max(getheight(root->left),getheight(root->right))+1;
}
 bool isBalanced(TreeNode* root){
     if(root==NULL) return true;
     stack <TreeNode*> s;
     s.push(root);
     while(!s.empty()){
        TreeNode* temp=s.top();
        //cout<<temp->val<<" ";
        if(abs(getheight(temp->left)-getheight(temp->right))>1) return false;
        s.pop();
        if(temp->right!=NULL){
            s.push(temp->right);
        }
        if(temp->left!=NULL){
            s.push(temp->left);
        }
    }
    return true;
 }
};

4.合法二叉搜索树

检查一棵树是否为二叉搜索树。二叉排序树或者是一个空树;或者是具有下列性质的二叉树:①若它的左子树不空,则左子树上所有结点的值均小于它的根节点的值②若它的右子树不空,则右子树上所有结点的值均大于它的根节点的值③它的左,右子树也分别为二叉排序树。

class Solution {
public:
    bool isValidBST(TreeNode* root) {
 if(root==NULL) return true;
     TreeNode* maxleft=root->left, *minright=root->right;
     while(maxleft!=NULL&&maxleft->right!=NULL) maxleft=maxleft->right;
     while(minright!=NULL&&minright->left!=NULL) minright=minright->left;
     //判断这一层是否合法
     bool re=(maxleft==NULL||root->val>maxleft->val)&&(minright==NULL||root->val<minright->val);
     return re&&isValidBST(root->left)&&isValidBST(root->right);
    }
};

5.二叉搜索树的最近公共祖先

参考https://leetcode-cn.com/problems/er-cha-sou-suo-shu-de-zui-jin-gong-gong-zu-xian-lcof/solution/mian-shi-ti-68-i-er-cha-sou-suo-shu-de-zui-jin-g-7/

这个root也不特指根节点。根据定义最近祖先公共节点也可以是节点本身。怎么来判断,root,p,q的子树关系?注意所有节点的值都是唯一的

class Solution {
public:
    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
        TreeNode* temp=root;//temp用来遍历
    while(temp!=NULL){
        if(p->val<temp->val&&q->val<temp->val) temp=temp->left;
        else if(p->val>temp->val&&q->val>temp->val) temp=temp->right;
        else break;
    }
    return temp;
    }
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值