日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

学习笔记:二叉搜索树的验证

發布時間:2025/3/13 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 学习笔记:二叉搜索树的验证 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

方法一(低效):
最開始想的辦法是,先寫 求二叉樹中最大值的函數,和一個求二叉樹中最小值的函數,然后調用這兩個函數 寫出 驗證二叉搜索樹的函數(因為要左邊小于右邊嘛),結果 時間復雜度特別大,老是超時

/*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode(int x) : val(x), left(NULL), right(NULL) {}* };*/ class Solution { public:bool isValidBST(TreeNode* root) {if(!root)return true;if(root&&root->left&&root->right){if(max_tree(root->left)<root->val&&min_tree(root->right)>root->val&&isValidBST(root->left)&&isValidBST(root->right))return true;else return false;}else{if(root->left){if(max_tree(root->left)<root->val&&isValidBST(root->left))return true;else return false;}else if(root->right){if(min_tree(root->right)>root->val&&isValidBST(root->right))return true;else return false;}else return true; }}int max_tree(TreeNode* root){if(root){//當根指針非空時int max = root->val;//最大值初始化為root的值if(root->left&&root->right){//當根指針的左右指針均非空時if(max_tree(root->left)>max|| max_tree(root->right)>max){//如果左右有一個大于maxif(max_tree(root->left)> max_tree(root->right))max = max_tree(root->left);else max = max_tree(root->right);} }else {//當左右指針至少有一個為空時if(root->left){if(max_tree(root->left)>max)max = max_tree(root->left);}else if(root->right){if(max_tree(root->right)>max)max = max_tree(root->right);}else; //當左右指針都為空時}return max; }else{return 0;} //當根指針為空時}int min_tree(TreeNode* root){if(root){//當根指針非空時int min = root->val;//最大值初始化為root的值if(root->left&&root->right){//當根指針的左右指針均非空時if(min_tree(root->left)<min|| min_tree(root->right)<min){//如果左右有一個if(min_tree(root->left)< min_tree(root->right))min = min_tree(root->left);else min = min_tree(root->right);} }else {//當左右指針至少有一個為空時if(root->left){if(min_tree(root->left)<min)min = min_tree(root->left);}else if(root->right){if(min_tree(root->right)<min)min = min_tree(root->right);}else; //當左右指針都為空時}return min; }else{return 0;} //當根指針為空時} };

方法二:利用中序遍歷,得到二叉樹的表,再查表看看是否是遞增的,如果是,則該二叉樹是二叉搜索樹,否則不是

#include<stdio.h> #include<limits.h> #include<string> #include<iostream> #include<vector>using namespace std; //definition for a binary tree node struct TreeNode{int val;TreeNode *left;TreeNode *right;TreeNode(int x): val(x),left(NULL),right(NULL) {}};class solution{ private:std::vector<int> vnums; public:bool isValidBST(TreeNode* root) {MOT(root);for(int ii=0;ii<vnums.size()-1;ii++){if(vnums[ii]>=vnums[ii+1])return false;}return true;}void MOT(TreeNode* root){if(root!=NULL){MOT(root->left);vnums.push_back(root->val);MOT(root->right);} }};int main(int argc,char* * argv) {struct TreeNode* root;root = (TreeNode*)malloc(sizeof(TreeNode));root->val = 4;root->left =(TreeNode*)malloc(sizeof(TreeNode)); root->right = (TreeNode*)malloc(sizeof(TreeNode));root->left->val =2; root->right->val = 6;root->left->left =(TreeNode*)malloc(sizeof(TreeNode)); root->left->right = (TreeNode*)malloc(sizeof(TreeNode));root->left->left ->val =1; root->left->right->val = 3;root->left->left->left=NULL; root->left->right->left=NULL;root->left->left->right=NULL; root->left->right->right=NULL;root->right->left =(TreeNode*)malloc(sizeof(TreeNode)); root->right->right = (TreeNode*)malloc(sizeof(TreeNode));root->right->left ->val =5; root->right->right->val = 7;root->right->left->left=NULL; root->right->right->left=NULL;root->right->left->right=NULL; root->right->right->right=NULL;solution s1;s1.isValidBST(root);return 0; }

總結

以上是生活随笔為你收集整理的学习笔记:二叉搜索树的验证的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。