1.二叉搜索樹的簡介
- 性質
二叉查找樹(Binary Search Tree),(又:二叉搜索樹,二叉排序樹)它或者是一棵空樹,或者是具有下列性質的二叉樹:
- 若它的左子樹不空,則左子樹上所有結點的值均小於它的根結點的值;
- 若它的右子樹不空,則右子樹上所有結點的值均大於它的根結點的值;
- 它的左、右子樹也分別爲二叉排序樹;
- 右子樹的結點的值一定大於等於左子樹結點的值。
- 應用
- 插入一個數值
- 查詢是否包含某個數值
- 刪除某個數值
- 算法實現
1.查找:遞歸查找是否存在key。
2.插入:原樹中不存在key,插入key返回true,否則返回false。
3.構造:循環的插入操作。
4.刪除:
(1)葉子節點:直接刪除,不影響原樹。
(2)僅僅有左或右子樹的節點:節點刪除後,將它的左子樹或右子樹整個移動到刪除節點的位置就可以,子承父業。
(3)既有左又有右子樹的節點:找到須要刪除的節點p的直接前驅或者直接後繼s,用s來替換節點p,然後再刪除節點s
2.LeetCode題目介紹
3.題目解法及解析
第一種做法:中序遍歷遞歸
/**
* 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:
int* last=NULL;//用於存儲中序遍歷遍歷的上一個的值
bool isValidBST(TreeNode* root) {
if(root){
if(!isValidBST(root->left)) return false;//如果左子樹不是二叉排序樹返回false
if(last&&*last>=root->val) return false;//如果當前點的值小於上一個中序遍歷的值則返回false
last = &root->val;//重置中值遍歷的值
if(!isValidBST(root->right)) return false;//如果右子樹不是二叉排序樹返回false
return true;
}else return true;//空樹返回true
}
};
第二種做法:把中序遍歷的值存入數組,然後判斷是否是升序的即可,由於算法效率較底不予實現。