(1) 二叉搜索数的判断
思路一:递归条件左右子树均为BSTs, 并且左孩子小于根节点,右孩子大于根节点(错误)
思路二:中序遍历结果是有序的!
(2)寻找树上某个节点的后继节点
思路:分析树的结构特点 (a). 如果节点x有右孩子,则直接返回右子树上的最左节点 (b). 找到第一个值大于x的父辈节点。
while(x->parent && x->parent->root!=x)
x=x->parent;
return x->parent
(3)BSTs 的插入和删除***
思路:直接放弃的题,太麻烦
(4)BSTs树上的搜索,寻找第一次包含key的节点
思路:【搜索题】给定key,按照key值得大小,决定是去左子树或者右子树搜索。另外小心key==root->val的情况,因为这可能不是第一次出现!只有强调inorder的BST树,才有前后大小而言!
while(root){
if(root->val == key){
isFound=true;
root=root->right;
}
else if(root->val < key){
root=root->right;
}
else{
first=root->val;
root=root->left;
}
}
(5)由array或者list构建BST
思路:将有序array or list的中间节点作为根节点,左边的作为左子树,右边的为右子树。
(6)由preorder序列构建BST
思路:由于二叉搜索树左小右大的特点,第一个节点为根节点,根后面所有小于根节点的节点构成左子树,其他的为右子树
(7)将BST转化成sorted doubly linked list
思路:递归的思想,将root节点append到左子树返回的链表,另外,将右子树返回的list append到root节点后,最后,将新链表的首位指针连接。
(8)BST树上找最大的k个节点
思路:中序遍历BST可以很容易得到最小的k个节点,返回来,我们利用right-root-left的顺序,可以得到最大的k个节点