您好,登錄后才能下訂單哦!
小編給大家分享一下Validate Binary Search Tree的示例分析,希望大家閱讀完這篇文章之后都有所收獲,下面讓我們一起去探討吧!
Given a binary tree, determine if it is a valid binary search tree (BST).
Assume a BST is defined as follows:
The left subtree of a node contains only nodes with keys less than the node's key.
The right subtree of a node contains only nodes with keys greater than the node's key.
Both the left and right subtrees must also be binary search trees.
解法一:
遞歸思想,遞歸先序遍歷,假定當前結點為root,其左子樹右下角節點為pre,右子樹左下角節點為next
情況一:root==NULL,return true
情況二:
root!=NULL,則判斷,
a)如果有左孩子,則如果root->left->val>=root->val ,則返回false;
b)如果比左子樹中右下角元素小,return false;
c)如果有右孩子,即如果root->right->val<=root->val,則返回false;
d)如果比右子樹左下角大,即如果next->val<=root->val,return false;
如果a,b,c,d都不為真,則說明,當前節點值比左孩子大,且比其前序節點值大,比右孩子小,且比后續節點值小,這時返回左子樹和右子樹的結果。
即
最后return BST(root->left)&&BST(root->right)
TreeNode* findpre(TreeNode *root){ if(!root||!root->left) return NULL; TreeNode *p=root->left; while(p->right){ p=p->right; } return p; } TreeNode* findnext(TreeNode *root){ if(!root||!root->right) return NULL; TreeNode *p=root->right; while(p->left){ p=p->left; } return p; } bool isValidBST(TreeNode* root) { if(!root) return true; if(root->left&&root->left->val>=root->val) return false; if(root->right&&root->right->val<=root->val) return false; TreeNode *pre=findpre(root),*next=findnext(root); if(pre&&pre->val>=root->val||next&&next->val<=root->val) return false; return isValidBST(root->left)&&isValidBST(root->right); }
解法二:
從解法一看出,其實只要保證,當前值比左子樹pre節點大,且比右子樹next節點值小即可,可以把a,b,這兩種情況注釋掉,但存在也是有一定用處的,可以首先判斷左右孩子,如果左右孩子都不滿足,則就不用找前序和后繼了。
bool isValidBST(TreeNode* root) { if(!root) return true; /*if(root->left&&root->left->val>=root->val) return false; if(root->right&&root->right->val<=root->val) return false;*/ TreeNode *pre=findpre(root),*next=findnext(root); if(pre&&pre->val>=root->val||next&&next->val<=root->val) return false; return isValidBST(root->left)&&isValidBST(root->right); }
解法三:
其實,利用中序遍歷可以得到有序序列,只要當前節點比前一個節點大,即是BST,
bool isValidBSTCore(TreeNode *root,TreeNode *&pre){ if(!root) return true; if(!isValidBSTCore(root->left,pre))//左子樹 return false; if(pre&&pre->val>=root->val)//當前結點與前節點比較 return false; pre=root;//修改pre return isValidBSTCore(root->right,pre);//右子樹 } bool isValidBST(TreeNode* root) { if(!root) return true; TreeNode *pre=NULL; return isValidBSTCore(root,pre); }
看完了這篇文章,相信你對“Validate Binary Search Tree的示例分析”有了一定的了解,如果想了解更多相關知識,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。