[树] 在二分搜索树的一些操作
[qads]
二叉搜索树 (CNPTK) 是一个二进制树中的每个节点, 钥匙锁钮是更多地考虑树的所有节点和左树必须的所有节点的小键.
这里是一个二分搜索树的一例:
内容
树形结构
添加元素的树
进入树
浏览树
发现在树中的节点
删除树中的节点
代码完全参考
在CNPTK感谢键约束, 结果变成为导向. 进一步, 由搜索树结构变得显著更快. 如果N是节点在树中的数量,大约log2N平均搜索成本.
树形结构:
typedef int item; //kieu item la kieu nguyen struct Node { item key; //truong key cua du lieu Node *Left, *Right; //con trai va con phai }; typedef Node *Tree; //cay
更多 1 在树中的元素
添加元素X在树必须满足CNPTK的约束. 您可以在树中添加许多不同的地方, 但如果添加的叶节点将是最方便的,因为我们可以执行相同的搜索操作. 一旦终止搜索过程也是时间去寻找空间更.
int insertNode(Tree &T, item x) // chen 1 Node vao cay { if (T != NULL) { if (T->key == x) return -1; // Node nay da co if (T->key > x) return insertNode(T->Left, x); // chen vao Node trai else if (T->key < x) return insertNode(T->Right, x); // chen vao Node phai } T = (Node *) malloc(sizeof(Node)); if (T == NULL) return 0; // khong du bo nho T->key = x; T->Left = T->Right = NULL; return 1; // ok }
进入树
树是进入反复插入 1 元成树一定条件下,然后停止. 在停止状态输入元素下面的代码= 0.
void CreateTree(Tree &T) // nhap cay { int x; while (1) { printf("Nhap vao Node: "); scanf("%d", &x); if (x == 0) break; // x = 0 thi thoat int check = insertNode(T, x); if (check == -1) printf("Node da ton tai!"); else if (check == 0) printf("Khong du bo nho"); } }
导入完成, 虽然很多人喜欢的,但代码不知道树条目是什么类型 :3 (我一直在等)
浏览树
在二叉搜索树操纵浏览树是完全一样的二叉树. 尤其是浏览的订单时, 浏览按钮顺序将给予一系列的按钮在关键的升序. (1, 2, 3, 4, 5, 6, 7, 8, 9, 12, 20, 23)
void LNR(Tree T) { if(T!=NULL) { LNR(T->Left); printf("%d ",T->key); LNR(T->Right); } }
在树中寻找节点关键= X
Node* searchKey(Tree T, item x) // tim nut co key x { if (T!=NULL) { if (T->key == x) { Node *P = T; return P;} if (T->key > x) return searchKey(T->Left, x); if (T->key < x) return searchKey(T->Right, x); } return NULL; }
删除节点键= X树
从树设置一个元素X的,以确保CNPTK的约束. 有 3 可能会出现一个终端节点X的情况下:
– X是一个叶节点: 简单地取消在X,因为它不挂接到任何其他元素.
– X只 1 同 (左或右): 在取消X X我们勾父亲对他唯一的孩子.
– X为所有 2 同: 它不能用X直接取消有足够 2 同. 我将摧毁间接. 相反,取消X的, 我们会发现一个网元的Q. 该元素具有最大. 存储在Q的信息将被转移到存储在X. 后, 按钮将被取消q实际上像 2 第一种情况. 问题是要选择Q,使得当在处所X的流量Q, 植物遗存CNPTK.
有 2 元素满意:
+ 最小的元素 (最左边) 在苗.
+ 最大的元素 (最右边的) 在左边的树.
选择元件是完全依赖于编程的兴致的网络元件. 在这段代码中我选择的元素,最.
int delKey(Tree &T, item x) // xoa nut co key x { if (T==NULL) return 0; else if (T->key > x) return delKey(T->Left, x); else if (T->key < x) return delKey(T->Right, x); else // T->key == x { if (T->Left == NULL) T = T->Right; // Node chi co cay con phai else if (T->Right == NULL) T = T->Left; // Node chi co cay con trai else // Node co ca 2 con { Node *Q = T->Left; while (Q->Right != NULL) { Q = Q->Right; } T->key = Q->key; delKey(T->Left, Q->key); } } return 1; }
参考代码:
#include<stdlib.h> #include<stdio.h> typedef int item; //kieu item la kieu nguyen struct Node { item key; //truong key cua du lieu Node *Left, *Right; //con trai va con phai }; typedef Node *Tree; //cay int insertNode(Tree &T, item x) // chen 1 Node vao cay { if (T != NULL) { if (T->key == x) return -1; // Node nay da co if (T->key > x) return insertNode(T->Left, x); // chen vao Node trai else if (T->key < x) return insertNode(T->Right, x); // chen vao Node phai } T = (Node *) malloc(sizeof(Node)); if (T == NULL) return 0; // khong du bo nho T->key = x; T->Left = T->Right = NULL; return 1; // ok } void CreateTree(Tree &T) // nhap cay { int x; while (1) { printf("Nhap vao Node: "); scanf("%d", &x); if (x == 0) break; // x = 0 thi thoat int check = insertNode(T, x); if (check == -1) printf("Node da ton tai!"); else if (check == 0) printf("Khong du bo nho"); } } // Duyet theo LNR void LNR(Tree T) { if(T!=NULL) { LNR(T->Left); printf("%d ",T->key); LNR(T->Right); } } Node* searchKey(Tree T, item x) // tim nut co key x { if (T!=NULL) { if (T->key == x) { Node *P = T; return P;} if (T->key > x) return searchKey(T->Left, x); if (T->key < x) return searchKey(T->Right, x); } return NULL; } int delKey(Tree &T, item x) // xoa nut co key x { if (T==NULL) return 0; else if (T->key > x) return delKey(T->Left, x); else if (T->key < x) return delKey(T->Right, x); else // T->key == x { if (T->Left == NULL) T = T->Right; // Node chi co cay con phai else if (T->Right == NULL) T = T->Left; // Node chi co cay con trai else // Node co ca 2 con { Node *Q = T->Left; while (Q->Right != NULL) { Q = Q->Right; } T->key = Q->key; delKey(T->Left, Q->key); } } return 1; } int main() { Tree T; T=NULL; //Tao cay rong CreateTree(T); //Nhap cay //duyet cay printf("Duyet cay theo LNR: \n"); LNR(T); printf("\n"); Node *P; item x; printf("Nhap vao key can tim: "); scanf("%d", &x); P = searchKey(T, x); if (P != NULL) printf("Tim thay key %d\n", P->key); else printf("Key %d khong co trong cay\n", x); if (delKey(T, x)) printf("Xoa thanh cong\n"); else printf("Khong tim thay key %d can xoan", x); printf("Duyet cay theo LNR: \n"); LNR(T); printf("\n"); return 0; }
阅读更多: 跳二叉树成二进制搜索树
良好的博客! 我真的很喜欢它是如何很容易在我的眼睛和数据都写得很好. 我想知道我怎么能得到通知,每当一个新的职位已. 我已经订阅了您的饲料必须做的伎俩! 祝你今天愉快! efdecfbbekke
非常感谢. 你照顾我的博客. 如果你有一个WordPress的帐户,并想跟着我, 您可以点击按钮 “跟随” 顶部:
或者你可以回主页,看到底部. 输入您的电子邮件,然后点击按钮 “订阅”. 我将发送到您的邮箱,每当一个新的职位已:
他问我,我不明白的java.nhung代码 1 空间是T = (节点 *) 的malloc(的sizeof(节点)); 想什么?
我不寒而栗TNODE根 ;
类TNODE{
int数据;
TNODE离开,权;
TNODE(INT x){
数据= X;
左=右= NULL;
}
TNODE(INT x,TNODE LL,TNODE RR){
数据= X;
左= 11;
右= RR;
}
}
公共类演示 {
TNODE根;
INT insertNode(TNODEŤ,INT x){
如果(牛逼!= NULL){
如果(T.data == X)
回报 -1;
其他{
如果(T.data<X)
返回insertNode(T.right,X);
其他
返回insertNode(T.left,X);
}
}
如果 (Ť== NULL) 回报 0; // 没有足够的内存
T.data = X;
T.left = T.right = NULL;
回报 1; // 行
}
/*INT插入(INT x){
返回insertNode(根,X);
}*/
无效nhapcay(TNODEŤ){
INT x;
扫描仪KB =新的扫描仪(System.in);
而(真正){
是System.out.print("x= ");
X = kb.nextInt();
如果(X == 0)
休息;
INT检查= insertNode(牛逼,X);
如果 (检查== -1) 的System.out.println("Node da ton tai!");
否则,如果 (检查== 0) 的System.out.println("Khong du bo nho");
}
}
无效纳米羟基磷灰石(){
nhapcay(根);
}
无效xuat(TNODEŤ){
xuat(T.left);
是System.out.print(T.data);
xuat(T.right);
}
无效duyet(){
xuat(根);
}
公共静态无效的主要(串[] 早){
演示一=新演示();
a.nhap();
a.duyet();
}
}
意味着指针牛逼NHE内存分配.
为节点T被分配的内存结构节点大小的尺寸大小NHE你 !!
为什么不能让 1 所有的C出生诶二进制他..!!
或这样的调整的组合:
孩子是 1 最佳文章,但不知道尚最优。?
=)) 做到这一点. 有限的时间, 我不写的一切.
晚报..!!
这种情况:
这里是代码印刷n个顺应ķ卷积, 看上去有点瘦.. ^^
而问题是两轮 () 我已经打上ķ知道如何优化..!
尊敬的前辈武学长, 高老师的心愿唯一途径, 应采取一些改善….!!
时int k,ñ;
一个INT[200];
无效ChinhHop ( 诠释J){
诠释他们= 0;
如果 (Ĵ==ķ){
// 为 (INT I = 0 ; 在 < 到 – 1; 我 ){
// 为(INT J = + 1; Ĵ < 到; J )
如果 ( 该[在] ==一[Ĵ] )
该++;
}
如果 (在== 0 ){
为 (INT I = 0 ; 在<到 ; 我 ){
的printf ("%d ", 该[在]) ;
}
的printf("\n");
}
的= 0;
}其他{
为 (INT I = 1 ; 在<= N ; 我 ){
该[Ĵ]=我;
Chinhः运 (j+1);
}
}
}
INT主要 (){
scanf函数 ("%d%d",&到,&ñ);
Chinhः运 ( 0 );
回报 0;
}
提供!
第一封感谢在他的博客上关于A股.
星期一, 一个可以分享更多的学习方法进行编程, 学习如何发展的道路是不是? 要使电子邮件问, 在编程, 什么是最重要的,先生。? Ë不高明, 不管是好学校成为一个程序员是不是? 🙁
亲切 3, f转发文档分享一些学习,一个所谓好的,有用.
Ë感谢A A! 🙂
如何学习编程,每个人都有一种方式, 这取决于能力, 喜欢… 经常看到别人的代码 (或者看到另一个代码) 然后再次代码, 完成代码问自己同样的练习跑OK,然后编辑成自己的代码…
在编程中,它也取决于. 最重要的是,一直在学习 & 结交新朋友. 一些领域,如应用程序的开发,有必要添加算法.
不聪明的他们如何知道什么时候新学校…
哪里是她的整个谷歌… 从来没有总是读…
行
cho em hỏi sao cứ nhập X mãi thế anh… :3
Cái này là nhập đến khi nào nhập số 0 thì dừng lại mà.
🙂 @@@… em mới vào nghề nên không hiểu lắm.. 嗨… thank anh 😛
e cảm ơn anh vì bài viết rất bổ ích với e. 但是当他的电子运行的程序, 如果节点具有左,右,当您浏览树查看错误. 他的回答是不,先生帮助è.
那你尝试观看. 测试你的跑步OK,然后就放弃.
他问我 , 在某些情况下进入 0 停止 , 但我想有树的元素 0 那么如何 ? 谢谢您
然后你输入一定数量的任何. 例如NOA非常大或非常小. 999999999 这样.
先生 , 我的意思是,他VD : 我想树作为 2 3 4 0 5 6 7;
那么,如果按照他的代码,它只是浏览 2 3 4 遣散先生 , 希望大家帮 !
就在那时,因为使得条目 0 被停止. 你停下来变化的条件是确定
行 , 感谢我的 !!!
Ë问亲爱的,,在InsertNode A A,,现在我不用再使用递归循环格式,,看到明星? 和ZIP格式是如何循环?
这一个是肯定,但我还没有做过这么好了你也不.
英国审查删除节点去他. 假设树如图所示. 如果您删除节点(12) 然后
P - > 节点(12);
S-> 节点(12);
Q-> 节点(9);
然后P->关键= 9;
S->权 (节点(23)) = Q->左 (NULL)
因此,采取节点(23) 和节点(20) R A
谢谢. Mình đã sửa lỗi nhé.
在节点删除树功能,如果程序刚刚进入 3 任何数量 (例如:: 3, 4, 5) 该程序将失败.
谢谢. Mình đã sửa lỗi nhé.
火腿删除节点* S = T, *Q = S->剩下;
// S是Q的父, Q拉节点香辣蟹儿子P的衰落
而 (Q->对 != NULL)
{
S = Q;
Q = Q->对;
}
P->关键= Q->键;
S->右= Q->剩下;
删除问与答;
有问题. 运行错误
谢谢. Mình đã sửa lỗi nhé.
想念你这个指南,以帮助您bt后
二叉树搜索每个节点的钱是一个整数
该. 其与两个苗木的价值值多少树木鬼按钮活夜景也是素数
b.tim苗最大总共T个 ( 找到你把一棵树 ) 或者只知道总能找得到的价值
code phần delete key cua anh nếu xét trường hợp cây con bên trái trỏ đến phải là NULL thì bị sai, anh xem có đúng không. Thank anh!
非常感谢. Mình sẽ kiểm tra lại 😉
您好. 我想问下巴insertNode.
当T == NULL然后创建节点T然后赋值T->键, T->左和T->权, 但我没有看到节点节点钩否则这个命令. 你可以不解释?
当T == NULL即空心树, 树是空的,只需装入T值只因为它是原. 同时,左,右会想出什么NULL.
谢谢. 你能解释得更清楚是不是? 尝试一个具体的例子,例如.
这些是最明显的,你. 最初的空心树插入时将插入他的原创. 儿子, 儿童必须接受空.
但在我的代码不会看到另一个节点此节点钩之间的连接 (其他两个节点NULL) 但仍运行. 你能解释更多的是不?
总净初始树, 即T = NULL. 然后插入第一元件X1中,因为T = NULL应该认识T值是X1, T->左= T-右= NULL. 下一次插入的T != NULL然后, 所以取决于插入L-> BT的X2下一个树的值 (如果X2 < x1), hay T->权 (x2 > x1). 同时召回递归insertNote(T->离开) (假设插入左), 而它认为T->左边是 1 新T和这样做.
服务员, ZIP计数按钮, 树高NPTK先生NTN? 品种有k个二叉树?
似蜜. 🙂
感谢作者,文章对我来说非常有意义!
问自己,为什么作为部分InsertNode声明:
INT insertNode(树 &牛逼, X项)
这不是:
INT insertNode(树T, X项)
从 2 曾经有没有,2 如何不同?
谢谢!
有 &T是出函数T后保存树木的价值. 如果方式 2 那么树明函数T之后将保持在不插入项.
嗨哥,
在功能delKey(树 &牛逼, X项) {} 在行`S->右= Q->剩下;`平均先生. 现在
Q是树的果实的右节点, 和S是Q的父.
谢谢. Mình đã sửa lỗi nhé.
在代码中删除节点, 如果x ==(树的最后一个节点) 最后一个节点将指向NULL, 但一个被遗忘的记忆区域释放那个地方去.
没有出路顶部按钮 1 不是他的货.
có rất nhiều blog nhưng mình toàn tự học trên blog của bạn vì viết rất dễ hiểu, dễ tiếp thu
离线谢谢.