From 5e9ff157e9e960699af86b69f4e5bc643641f2f0 Mon Sep 17 00:00:00 2001 From: H1206950012 <39796243+H1206950012@users.noreply.github.com> Date: Thu, 13 Feb 2020 15:13:29 +0800 Subject: [PATCH] =?UTF-8?q?Update=209.=E4=BA=8C=E5=8F=89=E6=90=9C=E7=B4=A2?= =?UTF-8?q?=E6=A0=91=E7=9A=84=E6=93=8D=E4=BD=9C.cpp?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 这里的free放错位置会出问题的,改写会使程序更简洁 --- 上课Demo/9.二叉搜索树的操作.cpp | 92 ++++++++++++++++----------------- 1 file changed, 45 insertions(+), 47 deletions(-) diff --git a/上课Demo/9.二叉搜索树的操作.cpp b/上课Demo/9.二叉搜索树的操作.cpp index 35e0f85..cd68747 100644 --- a/上课Demo/9.二叉搜索树的操作.cpp +++ b/上课Demo/9.二叉搜索树的操作.cpp @@ -9,100 +9,98 @@ struct TreeNode{ BinTree Right; }; -// ҵݹʵ +// 查找递归实现 BinTree Find(ElementType X,BinTree BST){ - if(!BST) // Ϊգ NULL + if(!BST) // 如果根结点为空,返回 NULL return NULL; - if(X < BST->Data) // ȸСȥ + if(X < BST->Data) // 比根结点小,去左子树查找 return Find(X,BST->Left); - else if(BST->Data < X) // ȸȥ + else if(BST->Data < X) // 比根结点大,去右子树查找 return Find(X,BST->Right); - else if(BST->Data == X) // ҵ + else if(BST->Data == X) // 找到了 return BST; } -// ҷǵݹʵ +// 查找非递归实现 BinTree IterFind(ElementType X,BinTree BST){ while(BST){ if(X < BST->Data) BST = BST->Left; - else if(BST->Data < X) // ȸȥ + else if(BST->Data < X) // 比根结点大,去右子树查找 BST = BST->Right; - else if(BST->Data == X) // ҵ + else if(BST->Data == X) // 找到了 return BST; } return NULL; } -// Сֵĵݹʵ +// 查找最小值的递归实现 BinTree FindMin(BinTree BST){ - if(!BST) // Ϊˣ NULL + if(!BST) // 如果为空了,返回 NULL return NULL; - else if(BST->Left) // ֧ + else if(BST->Left) // 还存在左子树,沿左分支继续查找 return FindMin(BST->Left); - else // ҵ + else // 找到了 return BST; } -// ֵķǵݹʵ +// 查找最大值的非递归实现 BinTree FindMax(BinTree BST){ - if(BST) // - while(BST->Right) // ֻҪ + if(BST) // 如果不空 + while(BST->Right) // 只要右子树还存在 BST = BST->Right; return BST; } -// +// 插入 BinTree Insert(ElementType X,BinTree BST){ - if(!BST){ // Ϊգʼý + if(!BST){ // 如果为空,初始化该结点 BST = (BinTree)malloc(sizeof(struct TreeNode)); BST->Data = X; BST->Left = NULL; BST->Right = NULL; - }else{ // Ϊ - if(X < BST->Data) // С + }else{ // 不为空 + if(X < BST->Data) // 如果小,挂在左边 BST->Left = Insert(X,BST->Left); - else if(BST->Data < X) // 󣬹ұ + else if(BST->Data < X) // 如果大,挂在右边 BST->Right = Insert(X,BST->Right); - // ȣʲô + // 如果相等,什么都不用做 } return BST; } -// ɾ +// 删除 BinTree Delete(ElementType X,BinTree BST){ BinTree tmp; if(!BST) - cout<<"ҪɾԪδҵ"; - else if(X < BST->Data) // X ȵǰֵСɾ + cout<<"要删除的元素未找到"; + else if(X < BST->Data) // X 比当前结点值小,在左子树继续查找删除 BST->Left = Delete(X,BST->Left); - else if(BST->Data < X) // x ȵǰֵɾ + else if(BST->Data < X) // x 比当前结点值大,在右子树继续查找删除 BST->Right = Delete(X,BST->Right); - else{ // ҵɾ - if(BST->Left && BST->Right){ // ɾӽ - tmp = FindMin(BST->Right); // ҵֵС - BST->Data = tmp->Data; // ҵֵǵǰ - BST->Right = Delete(tmp->Data,BST->Right); // ǰҵСֵɾ - }else{ // ɾֻһӽûкӽ + else{ // 找到被删除结点 + if(BST->Left && BST->Right){ // 被删除结点有俩孩子结点 + tmp = FindMin(BST->Right); // 找到右子树中值最小的 + BST->Data = tmp->Data; // 用找到的值覆盖当前结点 + BST->Right = Delete(tmp->Data,BST->Right); // 把前面找到的右子树最小值结点删除 + }else{ // 被删除结点只有一个孩子结点或没有孩子结点 tmp = BST; - if(!BST->Left && !BST->Right) // ûкӽ - BST = NULL; - else if(BST->Left && !BST->Right) // ֻӽ + else if(!BST->Right) // 只有左孩子结点 BST = BST->Left; - else if(!BST->Left && BST->Right) // ֻҺӽ + else if(!BST->Left) // 只有右孩子结点 BST = BST->Right; + free(tmp); } - free(tmp); } return BST; } -// +// 中序遍历 void InOrderTraversal(BinTree BT){ if(BT){ - InOrderTraversal(BT->Left); // - cout<Data; // ӡ - InOrderTraversal(BT->Right); // + InOrderTraversal(BT->Left); // 进入左子树 + cout<Data; // 打印根 + InOrderTraversal(BT->Right); // 进入右子树 } } int main(){ @@ -125,14 +123,14 @@ int main(){ \ \ 2 9 */ - cout<<"Ľǣ"; + cout<<"中序遍历的结果是:"; InOrderTraversal(BST); cout<Data<Data<Left->Data<Right->Data<Data<Data<Left->Data<Right->Data<