二叉查找樹基礎
二叉查找樹(BST)滿足這樣的性質,或是一顆空樹;或左子樹節點值小於根節點值、右子樹節點值大於根節點值,左右子樹也分別滿足這個性質。
利用這個性質,可以迭代(iterative)或遞歸(recursive)地用O(lgN)的時間複雜度在二叉查找樹中進行值查找。
相關LeetCode題:
700. Search in a Binary Search Tree 題解
701. Insert into a Binary Search Tree 題解
二叉查找樹與有序序列
由性質可知,如果按中序(inorder)遍歷二叉查找樹,我們將得到遞增序列;反過來,如果中序遍歷的結果不是遞增序列,則所遍歷樹不是二叉查找樹。以下框架適用於多數需要中序遍歷二叉樹的場景:
//98. Validate Binary Search Tree
bool isValidBST(TreeNode* root) {
stack<TreeNode*> st;
TreeNode* prv=NULL;
while(root!=NULL||!st.empty()){
while(root!=NULL){
st.push(root);
root=root->left;
}
root=st.top();
st.pop();
if(prv!=NULL&&prv->val>=root->val) return false;
prv=root;
root=root->right;
}
return true;
}
二叉查找樹可以生成有序序列,同樣可以用有序序列構造二叉查找樹:遞歸地以中間值爲root,左側爲左子樹、右側爲右子樹。
相關LeetCode題:
98. Validate Binary Search Tree 題解
173. Binary Search Tree Iterator 題解
230. Kth Smallest Element in a BST 題解
108. Convert Sorted Array to Binary Search Tree 題解
449. Serialize and Deserialize BST 題解
二叉查找樹前序遍歷
若對二叉查找樹進行前序遍歷(preorder),也將得到滿足一定規則的序列 [根節點val, 左子樹, 右子樹],兩者也可以相互構造。
相關LeetCode題:
255. Verify Preorder Sequence in Binary Search Tree 題解
1008. Construct Binary Search Tree from Preorder Traversal 題解