学习数据结构笔记
二叉搜索树
二叉搜索树:一颗二叉树,可以为空。如果不为空,那么满足以下性质:
-
非空左子树
的所有键值小于其根节点的的值
-
非空右子树
的所有键值大于其根节点的值
-
左、右子树都是二叉搜索树
1 2 3 4 5 6 7 8 9 10 11 12
| Position Find(ElementType X, BinTree BST) { if (!BST) return NULL; if ( X > BST->Data) { return Find(X, BST->Data); } else if(X < BST->Data) { return Find(x, BST->Data); } else { return BST; } }
|
由于非递归函数
的执行效率高
,可以将尾递归
函数改为迭代
函数
1 2 3 4 5 6 7 8 9 10 11 12
| Position IterFind(ElementTyPe X, BinTree BST) { while(BST){ if(x > BST->Data){ BST = BST->Right; }else if(X < BST->Data) { BST = BST->Left; }else { return BST; } } return NULL; }
|
查找最大值和最小值
根据二叉树的特性,如果查找最大和最小元素那么:
最大元素一定在树的最右分支的端节点上
最小元素一定在树的最左节点的端节点上
1 2 3 4 5
| Position FindMid(BinTree BST) { if (!BST) return NULL; if(!BST->Left) return BST; return FindMid(BST->Lift); }
|
1 2 3 4 5 6 7 8
| Position FindMax(BinTree BST) { if(BST){ while(BST->Rlght) BST = BST->Rlght; } return BST; }
|
二叉搜索树的插入
插入的关键是找到元素应该插入的位置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| BinTree Insert(ElementType X, BinTree BST) { if (!BSt) { BST = malloc(sizeof(struct TreeNode)); BST->Data = X; BST->Left = BST->Right = NULL; } else { if(x < BST->Data){ BST->Left = Insert(x, BST->Left); }else if(x > BST-> Data){ BST->Right = Insert(X, BST-> Right) } } return BST; }
|
二叉树的删除
删除需要考虑三种情况
第一种情况比较简单,要删除的节点是一个叶节点,直接删除就可以了
第二种情况是要删除的节点还有叶节点,那么就需要删除这个节点并将叶节点赋值到这个位置
第三章情况是要删除的节点有左右叶节点,这种情况需要将这种情况简化为只有一个节点,那么就是用另一个节点代替被删除的节点:用左树的最小元素,或者右树的最大元素代替被删除的节点。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| BinTree Delete(ElementType X, BinTree BST) { Position Tmp; if (!BST) return NULL; if(X < BST->Data){ BST->Left = Delete(X, BST->Left); }else if(X > BST->Data) { BST->Right = Delete(X, BST->Right); } else { if (BST->Left && BST->Right) { Tmp = FinMid(BST->Right); BST->Data = Tmp->Data; BST->Right = Delete(BST->Data, BST->Right); } else { Tmp = BST; if(!BST->Left){ BST = BST->Right; }else if(!BST->Right) { BST = BSt->Lift; } free(Tmp); } } return BST; }
|
平衡二叉树
平衡因子,简称 BF(T) = hl - hr
其中 hl 和 hr 分别为左、右子树的高度。
平衡二叉树空树,或者任一节点左、右子树高度差绝对值不能超过 1
平衡二叉树的调整。
不平衡的的发现者的麻烦节点在发现者的右子树的右边,因而叫做 RR 插入,需要 RR 旋转。
对应的还有 LL 旋转。
不平衡额发现者的麻烦节点在左子树的右边,因而叫做 LR 插入,需要 LR 旋转。