算法导论程序29--二叉搜索树的插入和删除(Python)
来源:互联网 发布:云教学平台为您优化 编辑:程序博客网 时间:2024/06/05 15:19
删除比较麻烦:
1.如果z没有孩子结点,那么只是简单地将它删除,并修改它的父结点。用NIL作为孩子来替换z。
2.如果z只有一个孩子,那么将这个孩子提升到树中z的位置上,并修改z的父结点,用z的孩子来替换z。
3.如果z有两个孩子,那么找z的后继y(一定在z的右子树中)并让y占据树中z的位置,z的原来右子树部分成为y的新右子树,并且z的左子树成为y的新左子树。如果y位于z的右子树中,但不是z的右孩子,那么,先用y的右孩子替换y,然后再用y替换z。
class Node: def __init__(self,key,right,left,p): self.key=key self.right=right self.left=left self.p=pclass tree: def __init__(self,root): self.root=root def tree_insert(self,z): y=None x=self.root while x!=None: y=x if z.key<x.key: x=x.left else: x=x.right z.p=y if y==None: self.root=z elif z.key<y.key: y.left=z else: y.right=z def inorder_tree_walk(self,x): if x!=None: self.inorder_tree_walk(x.left) print(x.key) self.inorder_tree_walk(x.right) def tree_search(self,x,k): if x==None or k==x.key: return x if k < x.key: return self.tree_search(x.left,k) else: return self.tree_search(x.right,k) def iterative_tree_search(self,x,k): while x!=None and k!=x.key: if k<x.key: x=x.left else: x=x.right return x def tree_minimum(self,x): while x.left!=None: x=x.left return x def tree_maximum(self,x): while x.right!=None: x=x.right return x def tree_successor(self,x): if x.right!=None: return self.tree_minimum(x.right) y=x.p while y!=None and x==y.right: x=y y=y.p return y def tree_delete(self,z): if z.left==None: self.transplant(z,z.right) elif z.right==None: self.transplant(z,z.left) else: y=self.tree_minimum(z.right) if y.p!=z: self.transplant(y,y.right) y.right=z.right y.right.p=y self.transplant(z,y) y.left=z.left y.left.p=y def transplant(self,u,v): if u.p==None: self.root=v elif u==u.p.left: u.p.left=v else: u.p.right=v if v!=None: v.p=u.p运行结果:
>>> root=Node(15,None,None,None)>>> t=tree(root)>>> T=[6,18,3,7,17,20,2,4,13,9]
>>> for i in T:r=Node(i,None,None,None)t.tree_insert(r)>>> t.inorder_tree_walk(t.root)2346791315171820
>>> t.tree_delete(t.tree_search(t.root,7))>>> t.inorder_tree_walk(t.root)234691315171820
阅读全文
0 0
- 算法导论程序29--二叉搜索树的插入和删除(Python)
- 【算法导论】二叉搜索树的插入和删除
- 算法导论程序28--查询二叉搜索树(Python)
- 算法导论程序39--最优二叉搜索树(Python)
- 算法导论笔记之----二叉搜索树的插入、删除、搜索操作
- 二叉搜索树的插入和删除
- 二叉搜索树的插入和删除
- 二叉搜索树的插入和删除
- 二叉搜索树的插入和删除
- 二叉搜索树的插入和删除
- 二叉搜索树的插入和删除
- 数据结构与算法分析--二叉排序树(二叉查找树,二叉搜索树)的查找、插入和删除操作
- 二叉搜索树的搜索、插入、遍历和删除(Java)
- 二叉搜索树的插入、搜索和删除
- 二叉搜索树的插入,搜索,删除
- 算法导论程序31--红黑树的插入(Python)
- 二叉搜索树常用算法(创建,遍历,插入,删除)
- 二叉搜索树(BST)的创建、插入、查找和删除
- typescript中使用字典Dictionary
- IO/输入输出
- Centos 7配置JDK1.8_第一节
- Spring Boot 之Maven配置
- Springmvc rest 传递json报415错误(The server refused this request because the request entity is in a forma
- 算法导论程序29--二叉搜索树的插入和删除(Python)
- sourceinsight 4.0 编码乱码修改
- playbook语法和命令
- 0628Blog总集
- 嵌入式面试题
- Paxos理解
- 每日AC -- 主对角线打印二维数组---美团点评2016研发工程师编程题(二)
- Spring--IoC--基于注解的DI-组件扫描器的base-package
- nodejs