還是前面那個題,同學去阿里面試的時候,要求寫出**:
現在有一棵二叉排序樹,每個節點儲存乙個int型別的值,刪除值為10以下的節點(樹中可能不含值為10的節點),說一下思路,寫一下演算法。
算了原來錯誤的思路就不拿出來誤導大家了,只能說想簡單了,花了幾天空閒的時間思考這個問題,終於把**寫出來了,雖然琢磨了一段時間,但是終究還是寫出來了。
經過測試資料或者自己畫圖,感覺有這麼幾個難點把
1.如果資料是這樣:6,5,
7,8,15,就是先開始根結點的值小於10,後來右子樹中=存在大於10的結點,由於需要釋放小於10的結點,就需要重新調整根結點
2.如果資料是這樣:6,5,7,8,15,14,9,8,13,11,10,就是先開始小於10,然後右子樹出現了大於了10,結果峰迴路轉左子樹中又有小於10的結點,其實這組資料基本就包含了核心**的思想
**思想:如果當前結點小於10的話,就迴圈查詢右子樹,直到找到第乙個大於10的結點p,然後調整樹結構,接著迴圈查詢p的左子樹,直到找到又出現第乙個小於10的結點,然後遞迴查詢右子樹和左子樹整個過程,直到沒有大於10的結點為止
**如下,其中題目要求為刪除的值為10,當然更通用的是刪除值為val以下的結點(如果結點值等於val,也會被刪除),另外在建立樹的時候由於為了方便測試**,所以隨機生成,但是對於有相同值,會自動忽略,也就是樹中的所有結點值都是唯一的:
#include #include #include struct bitree;
struct bitree* createbst(struct bitree *root,int val)
if(valdata) root->lchild=createbst(root->lchild,val);
else if(val>root->data) root->rchild=createbst(root->rchild,val);
return root;
}void inorder(struct bitree*root)
int delval(struct bitree **root,int val)
if(valuelchild=p;
while(p&&p->data>val)
if(p==null) break;
q=pre;
} return 1;
}int main()
for(i=0;i<10;i++)
printf("\n");
for(i=0;i<9;i++) root=createbst(root,a[i]);
inorder(root);
printf("\n");
int val;
scanf("%d",&val); //輸入某個值,小於這個值的所有結點都會被刪除
delval(&root,val);
inorder(root);
printf("\n\n");
root=null; }
return 0;
}
如果文章有什麼錯誤或者有什麼建議,歡迎提出,大家共同交流,一起進步
二叉排序樹刪除
二叉排序樹的刪除情況比較複雜,有以下三種情況需要考慮 第一種情況 刪除葉子節點 思路 第二種情況 刪除只有一棵子樹的節點,比如1 思路 如果targetnode有右子節點 第三種情況 刪除有兩棵子樹的節點 比如 7,3,10 思路 public class binarysorttreedemo bi...
構造二叉排序樹(BST) 二叉排序樹的刪除
主要是刪除操作 include include using namespace std typedef int elementtype typedef struct treenode threadtree void visit treenode node void inorder threadtre...
二叉排序樹的刪除
對於一般的二叉樹來說,刪去樹中的乙個結點是沒有意義的,因為它將使以被刪除的結點為根的子樹變成森林,破壞了整棵樹的結構 但是,對於二叉排序樹,刪去樹上的乙個結點相當於刪去有序序列中的乙個記錄,只要在刪除某個結點後不改變二叉排序樹的特性即可。在二叉排序樹上刪除乙個結點的演算法如下 btree delet...