二叉搜索树
对于二叉树,假设x为二叉树中的任意一个结点,x节点包含关键字key,节点x的key值记为key[x]。如果y是x的左子树中的一个结点,则key[y] <= key[x];如果y是x的右子树的一个结点,则key[y] >= key[x]。那么,这棵树就是二叉查找树。
性质
- 若任意节点的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
- 任意节点的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
- 任意节点的左、右子树也分别为二叉查找树。
- 没有键值相等的节点(no duplicate nodes)。
由上面的性质很容易看出来,二叉查找树的中序遍历是一个增序的序列。因此,二叉搜索树的最小值是在最左边,最大值是在最右边。
二叉树的插入
TreeNode *bstInsert(int val, TreeNode *root){ if (!root){ return new TreeNode(val); } else if (root->val > val){ root->left = bstInsert(val, root->left); } else if(root->val < val) { root->right = bstInsert(val, root->right); } return root; }
二叉树的删除
TreeNode *bstDelete(int val, TreeNode *root){ if (!root){ cout << "element not found" << endl; return nullptr; } else if (root->val > val){ root->left = bstDelete(val, root->left); } else if(root->val < val) { root->right = bstDelete(val, root->right); } else{//为root节点时 //首先找到右子树的最小值或者左子树的最大值 if (root->left && root->right){ TreeNode *pa = nullptr; TreeNode *rp = root->right; while (rp->left){ pa = rp;//保存最小值点的父节点 rp = rp->left; //找到右子树的最小值 } root->val = rp->val;//将该最小值替换到root //父节点不为空,则最小值节点为其左子树 if (pa) pa->left = bstDelete(rp->val, rp);//递归删除该最小值节点 else root->right = bstDelete(rp->val, rp);//否则,是root的右孩子 } else{//左右子树有一个为空,则可以直接删除根节点 TreeNode *p = root; if (!root->left)root = root->right; else if (!root->right)root = root->left; else root = nullptr; delete p; } } return root; }
从插入删除操作可以看出,同一个元素在二叉搜索树中删除后再插入位置可能不一样;而且二叉搜索树多次插入删除后,可能会出现树枝偏向一边,即根节点的一边的子树节点很少,另一边节点很多,这种不平衡的状态。因此,它的查找复杂度最坏可能是O(n)。
二叉搜索树的应用
95 Unique Binary Search Trees II 列出节点值为[1,n]的所有可能二叉搜索树
解决方法参考下面博文:http://www.cnblogs.com/yeqluofwupheng/p/6755645.html
96 Unique Binary Search Trees 找到节点值为[1,n]的所有可能二叉搜索树的数量
解决方法参考下面博文:http://www.cnblogs.com/yeqluofwupheng/p/6661393.html
98 Validate Binary Search Tree 判断一个二叉搜索树是否合法
解决方法参考下面博文:
99 Recover Binary Search Tree
108 Convert Sorted Array to Binary Search Tree
109 Convert Sorted List to Binary Search Tree
173 Binary Search Tree Iterator
230 Kth Smallest Element in a BST
235 Lowest Common Ancestor of a Binary Search Tree
255 Verify Preorder Sequence in Binary Search Tree
270 Closest Binary Search Tree Value
272 Closest Binary Search Tree Value II
285 Inorder Successor in BST
333 Largest BST Subtree
449 Serialize and Deserialize BST
450 Delete Node in a BST
501 Find Mode in Binary Search Tree
530 Minimum Absolute Difference in BST
538 Convert BST to Greater Tree
653 Two Sum IV - Input is a BST