bst 刪除節點_在BST中刪除大于或等于k的節點

bst 刪除節點

Problem statement:

問題陳述:

Given a BST and a value x, write a function to delete the nodes having values greater than or equal to x. The function will return the modified root.

給定一個BST和一個值x ,編寫一個函數刪除值大于或等于x的節點 。 該函數將返回修改后的根。

Example:

例:

Input BST
8
/  \
4    10
/ \   / \
3   5  9  11
Input X:  10
After deletion:
8
/  \
4    9
/ \   
3   5  

Solution:

解:

Basic properties of BST:

BST的基本屬性:

  1. All node values are distinct.

    所有節點值都是不同的。

  2. The left child node is always smaller than the root & right child node is always greater than the root.

    左子節點始終小于根節點,右子節點始終大于根節點。

Thus it's clear whenever a root has a value greater than or equal to the input value X, the entire right subtree and root need to be deleted, but not the left one.

因此,很明顯,只要根的值大于或等于輸入值X ,就需要刪除整個右子樹和根,而不必刪除左子樹和根。

Algorithm:

算法:

FUNCTION buildTree (root,X)
IF (root==NULL)
Return NULL;
END IF
IF (root->data is equal to X)
return root->left; //returning the left subtree basically
ELSE IF(root->data>key)
//recur for the left subtree since left subtree may also have nodes 
//that need to be deleted due to greater or equal values
return buildTree(root->left, X); 
ELSE
//root is not at all to be deleted, same for left subtree, 
//recursively process right subtree
root->right=buildTree(root->right, X);
return root;
END FUNCTION

The above function actually builds the tree deleting the nodes having greater and equal value than X.

上面的函數實際上是在構建樹,刪除值大于和等于X的節點。

Example with Explanation:

解釋示例:

Nodes are represented by respected values for better understanding
8
/  \
4    10
/ \   / \
3   5  9  11
Input X:  10
At main we callbuildTree (8, 10)
------------------------------------------------
buildTree (8, 10)
root not NULL
8<10
Thus root->left= 8->left
root->right=buildTree (8->right, 10) //buildTree (10, 10)
------------------------------------------------
buildTree (10, 10)
root not NULL
10==10
Thus return root->left= 10->left=9
------------------------------------------------
Hence At buildTree (8, 10)
Thus root->left= 8->left
root->right=9 (9 is the root to the remaining subtree which is NULL here luckily)
So the tree actually becomes
8
/ \
4     9
/ \ 
3   5 

C++ Implementation:

C ++實現:

#include <bits/stdc++.h>
using namespace std;
class Node{
public:             
int data;           //value
Node *left;    //pointer to left child
Node *right;   //pointer to right child
};
// creating new node
Node* newnode(int data)  
{ 
Node* node = (Node*)malloc(sizeof(Node)); 
node->data = data; 
node->left = NULL; 
node->right = NULL; 
return(node); 
}
Node* buildTree(Node* root,int key){
if(!root)
return NULL;
if(root->data==key){
return root->left; //only left subtree not deleted
}
else if(root->data>key)
return buildTree(root->left,key); //recur for left subtree
else{
//root not deleted
//left subtree not deleted
//buld right subtree
root->right=buildTree(root->right,key); 
return root;
}
}
Node* deleteNode(Node* root, int key)
{
root=buildTree(root,key);
return root; 
}
void levelwisedisplay(Node *root)
{
//to display the tree level wise
queue<Node*> q;
Node* temp;
int count=0;
q.push(root);
q.push(NULL);
while(!q.empty()){
temp=q.front();
q.pop();
if(temp==NULL){
if(!q.empty())
q.push(NULL);
cout<<"\nend of level "<<count++<<endl;
}
else{
cout<<temp->data<<" ";
if(temp->left)
q.push(temp->left);
if(temp->right)
q.push(temp->right);
}
}
return ;
}
int main(){
cout<<"tree is built as per example\n";
Node *root=newnode(8); 
root->left= newnode(4); 
root->right= newnode(10); 
root->right->right=newnode(11);
root->right->left=newnode(9);
root->left->left=newnode(3); 
root->left->right=newnode(5);
printf("Displaying level wise\n");
levelwisedisplay(root);
root=deleteNode(root,10);//as per example
printf("after deleting nodes greater or equal to 10\n");
levelwisedisplay(root);
return 0;
}

Output

輸出量

tree is built as per example
Displaying level wise
8      
end of level 0
4 10   
end of level 1
3 5 9 11      
end of level 2
after deleting nodes greater or equal to 10
8      
end of level 0
4 9    
end of level 1
3 5    
end of level 2 

翻譯自: https://www.includehelp.com/icp/delete-nodes-greater-than-or-equal-to-k-in-a-bst.aspx

bst 刪除節點

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/542172.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/542172.shtml
英文地址,請注明出處:http://en.pswp.cn/news/542172.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

游戲架構之二(轉)

棋牌類游戲常用架構&#xff1a; 我從事過4年的棋牌類游戲開發&#xff0c;使用過的架構大致如上&#xff0c;各模塊解釋如下。 LoginServer&#xff1a; 登陸服務器&#xff0c;主要負責player 的登陸請求&#xff0c;驗證player的合法性&#xff0c;為合法的player分配sessio…

對lvm介紹

1. 什么是LVM LVM是 Logical Volume Manager&#xff08;邏輯卷管理&#xff09;的簡寫&#xff0c;它是Linux環境下對磁盤分區進行管理的一種機制&#xff0c;用戶在無需停機的情況下可以方便地調整各個分區大小。 lvm中的一些常見符號及意義 pv物理卷被lv命令處理過的物理分…

pythonweb自動化測試實例_[轉載]python?webdriver自動化測試實例

python webdriver自動化測試初步印象以下示例演示啟動firefox&#xff0c;瀏覽google.com,搜索Cheese&#xff0c;等待搜索結果&#xff0c;然后打印出搜索結果頁的標題from selenium import webdriverfrom selenium.common.exceptions import TimeoutExceptionfrom selenium.w…

repeated_Ruby中帶有示例的Array.repeated_combination()方法

repeatedArray.repeated_combination()方法 (Array.repeated_combination() Method) In this article, we will study about Array.repeated_combination() method. You all must be thinking the method must be doing something which is related to creating combinations o…

ApacheHttpServer修改httpd.conf配置文件

轉自&#xff1a;https://blog.csdn.net/dream1120757048/article/details/77427351 1. 安裝完 Apache HTTP Server 之后&#xff0c;還需要修改一下配置文件。 Apache 的配置文件路徑如下&#xff1a; C:\Program Files\Apache Software Foundation\Apache2.2\conf\httpd.conf…

大學物理實驗電學基本參數的測量實驗報告_大學物理電學實驗報告

技校網專門為您推薦的類似問題答案問題1&#xff1a;怎樣寫大學計算機基礎有關制作個人簡歷的實驗報告一、實驗名稱&#xff1a;個人簡歷的制作 二、實驗目的與要求: 1、熟悉Word 2003的基本操作 2、掌握利用網絡搜索獲得個人簡歷所需的資料 3、培養同學們動手能力和自學能力。…

python 線程模塊_Python線程模塊| main_thread()方法與示例

python 線程模塊Python threading.main_thread()方法 (Python threading.main_thread() Method) main_thread() is an inbuilt method of the threading module in Python. It is used to return the main Thread object. It is the thread from which the Python interpreter …

linux中系統修復

1. 引導文件丟失 &#xff08;1&#xff09;引導文件所在路徑 /boot/grub2/grub.cfg 需提前知道根目錄所在分區和內核版本 uname -r 查詢內核版本命令 模擬問題 rm -fr /boot/grub2/grub.cfg 一不小心把這玩意兒給刪了&#xff0c;還reboot了 完了以后機子開不了了就這情況 …

dw相對路徑怎么改_密云ETL怎么收費

密云ETL怎么收費&#xff0c;派客動力&#xff0c;公司依托自有產品&#xff0c;整合行業資源&#xff0c;構建先進的數據管理解決方案&#xff0c;解決企業和組織的核心數據問題以及被影響的業務挑戰。這種工具我都使用過&#xff0c;優點有&#xff1a;圖形界面&#xff0c;開…

python 自動化之路 day 08_2 網絡編程

本節內容 Socket介紹Socket參數介紹基本Socket實例Socket實現多連接處理通過Socket實現簡單SSH通過Socket實現文件傳送作業&#xff1a;開發一個支持多用戶在線的FTP程序1. Socket介紹 概念 A network socket is an endpoint of a connection across a computer network. Today…

查看scala變量數據類型_Scala文字,變量和數據類型| Scala編程教程

查看scala變量數據類型1)Scala數據類型 (1) Scala Data Types) Scala has the same set of data types as in Java. The traditional 14 data types are inherited as it is in Scala. Scala具有與Java中相同的數據類型集。 傳統的14種數據類型在Scala中被繼承。 The Followin…

Elasticsearch過濾與聚合的先后順序java實現

2019獨角獸企業重金招聘Python工程師標準>>> 一、Elasticsearch的聚合 ES的聚合相當于關系型數據庫里面的group by&#xff0c;例如查找在性別字段男女人數的多少并且按照人數的多少進行排序&#xff0c;在使用MySQL的時候&#xff0c;可以使用如下的句子 select se…

js手機號中間四位_11位手機號碼隱藏中間四位數,學會Substitute函數一鍵搞定!...

相信許多朋友都有見過手機號碼被*號隱藏中間四位數的情況。許多地方為了保護個人信息&#xff0c;都會將手機號的中間四位數用星號代替。如上圖所示&#xff0c;我們需要將原來的手機號碼&#xff0c;通過*號的方式變為隱藏后的加密模式。下面我們就來學習一下如何利用substitu…

python 整數最大_Python程序使用floor()方法查找最大整數

python 整數最大The greatest integer function is a function (real numbers function) to itself that is defined as follows: it sends any real number to the largest integer that is less than or equal to it. 最大整數函數是一個對其自身定義的函數(實數函數)&#x…

selinux對ftp的影響

1.啥是selinux 安全增強型Linux&#xff08;Security-Enhanced Linux&#xff09;簡稱selinux&#xff0c;它是一個Linux內核模塊&#xff0c;也是Linux的一個安全子系統。 selinux的狀態&#xff1a; Enforcing:強制模式&#xff0c;在selinux運作時&#xff0c;已經開始限制d…

ES6的class方法基本用法

為什么80%的碼農都做不了架構師&#xff1f;>>> 在ES5中我們通常通過構造函數&#xff0c;定義并生成新對象。 例如: function Point(name,age){this.namename;this.ageage;}Point.prototype{Who:function(){return "My name is "this.name",My age…

celery的中文_celery異步任務框架

目錄Celery一、官方二、Celery異步任務框架Celery架構圖消息中間件任務執行單元任務結果存儲三、使用場景四、Celery的安裝配置五、兩種celery任務結構&#xff1a;提倡用包管理&#xff0c;結構更清晰七、Celery執行異步任務包架構封裝八、基本使用celery.py 基本配置tasks.py…

關于linux mv指令機制

最近在mv文件的時候&#xff0c;操作失誤將生產服務器一個1TB的文件夾mv到了/opt/test目錄&#xff0c;因為最后/opt/目錄被沾滿所以1TB的文件夾沒有遷移過來&#xff0c;寫入了30GB數據到了/opt/test目錄&#xff0c;因為系統分區被沾滿&#xff0c;所以把test目錄給刪除了。 …

數據庫的管理

1. 數據庫的簡介 定義&#xff1a;數據庫&#xff08;Database&#xff09;就是一種按數據結構來組織&#xff0c;存儲和管理數據的倉庫&#xff0c;其中包含數據挖掘&#xff0c;大數據信息的推送。 mariadb數據庫管理系統是mysql的一個分支&#xff0c;主要由開源社區在維護&…

C#中的Dictionary字典類介紹(轉載)

C#中的Dictionary字典類介紹 關鍵字&#xff1a;C# Dictionary 字典 作者&#xff1a;txw1958原文&#xff1a;http://www.cnblogs.com/txw1958/archive/2012/11/07/csharp-dictionary.html 說明 必須包含名空間System.Collection.Generic Dictionary里面的每一個元素都…