在理解了几种基本类型之后,我们就要知道怎么用4个基础操作了
node *insert(node *root, int val) {
if(root == NULL) {
root = new node();
root->val = val;
root->left = root->right = NULL;
} else if(val < root->val) {
root->left = insert(root->left, val);
if(getHeight(root->left) - getHeight(root->right) == 2)
root = val < root->left->val ? rotateRight(root) : rotateLeftRight(root);
} else {
root->right = insert(root->right, val);
if(getHeight(root->left) - getHeight(root->right) == -2)
root = val > root->right->val ? rotateLeft(root) : rotateRightLeft(root);
}
return root;
}
首先我们要有一个计算高度的函数getHeight(node*);
树的算法大部分都是递归的,我们很喜欢这样做,但是如果稍微递归的复杂那么一点,可能就不那么直观了。
其实好好看看,也不难理解,就是判断插入点与当前根节点的大小关系,这里形成递归。
然后就是要判断这个操作会不会使得当前根节点的子树不平衡,如果不平衡,那么判断属于4种类型中的哪一种;这4种在开始判断插入点与当前点的大小关系时已经分成两类了,就是L-L,L-R型 R-R,R-L型,然后调用对应的函数即可。
最后,一定要有个直观的画面在脑子里,这样才是真的理解了,记住了,所有的算法都是这样,你能够在脑子里把过程模拟一遍才是真的记住了。人的想象力是很丰富的,要充分利用呀。
最好的检验方法是自己画图,然后像我一样写一篇博客,试试自己能不能解释清楚,如果自己觉得没问题,那就可以了。至于读者看不看得懂,那就看运气了。。。