算法导论程序27-什么是二叉搜索树
2017-05-26 15:33
302 查看
一棵二叉搜索树是以一棵二叉树来组织的。这样一棵树可以使用链表数据结构来表示,其中,每个结点就是一个对象,除了key和卫星数据之外,每个结点还包含属性left、right和p,它们分别指向结点的左孩子、右孩子和双亲。如果某个孩子结点和父结点不存在,则相应属性的值为NIL。根结点是树中唯一父指针为NIL的结点。
设x是二叉搜索树中的一个结点,如果y是x左子树中的一个结点,那么y.key<=x.key。如果y是x右子树中的一个结点,那么y.key>=x.key。
中序遍历(inorder tree walk):子树根的关键字位于其左子树关键字值和右子树的关键字值之间。
先序遍历(preorder tree walk):输出的根关键字在其左右子树的关键字值之前。
后序遍历(postorder tree walk):输出的根关键字在其左右子树的关键字值之后。
class Node:
def __init__(self,key,right,left,p):
self.key=key
self.right=right
self.left=left
self.p=p
class 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)运行结果:
>>> r=Node(12,None,None,None)
>>> t=tree(None)
>>> t.tree_insert(r)
>>> r=Node(5,None,None,None)
>>> t.tree_insert(r)
>>> t.inorder_tree_walk(t.root)
5
12
>>> r=Node(18,None,None,None)
>>> t.tree_insert(r)
>>> r=Node(2,None,None,None)
>>> t.tree_insert(r)
>>> r=Node(9,None,None,None)
>>> t.tree_insert(r)
>>> r=Node(15,None,None,None)
>>> t.tree_insert(r)
>>> r=Node(19,None,None,None)
>>> t.tree_insert(r)
>>> r=Node(17,None,None,None)
>>> t.tree_insert(r)
>>> r=Node(13,None,None,None)
>>> t.tree_insert(r)
>>> t.inorder_tree_walk(t.root)
2
5
9
12
13
15
17
18
19
设x是二叉搜索树中的一个结点,如果y是x左子树中的一个结点,那么y.key<=x.key。如果y是x右子树中的一个结点,那么y.key>=x.key。
中序遍历(inorder tree walk):子树根的关键字位于其左子树关键字值和右子树的关键字值之间。
先序遍历(preorder tree walk):输出的根关键字在其左右子树的关键字值之前。
后序遍历(postorder tree walk):输出的根关键字在其左右子树的关键字值之后。
class Node:
def __init__(self,key,right,left,p):
self.key=key
self.right=right
self.left=left
self.p=p
class 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)运行结果:
>>> r=Node(12,None,None,None)
>>> t=tree(None)
>>> t.tree_insert(r)
>>> r=Node(5,None,None,None)
>>> t.tree_insert(r)
>>> t.inorder_tree_walk(t.root)
5
12
>>> r=Node(18,None,None,None)
>>> t.tree_insert(r)
>>> r=Node(2,None,None,None)
>>> t.tree_insert(r)
>>> r=Node(9,None,None,None)
>>> t.tree_insert(r)
>>> r=Node(15,None,None,None)
>>> t.tree_insert(r)
>>> r=Node(19,None,None,None)
>>> t.tree_insert(r)
>>> r=Node(17,None,None,None)
>>> t.tree_insert(r)
>>> r=Node(13,None,None,None)
>>> t.tree_insert(r)
>>> t.inorder_tree_walk(t.root)
2
5
9
12
13
15
17
18
19
相关文章推荐
- 算法导论第六章堆排序所给的伪代码转换具体程序
- 【算法导论】学习笔记——第12章 二叉搜索树
- 算法导论之动态规划:最优二叉搜索树
- 算法导论 最长公共子序列的c程序实现带主函数
- 【算法导论】程序出错的解释说明
- 算法导论程序8--堆(Python)
- 【算法导论】二叉搜索树的插入和删除
- 算法导论-第12章-二叉搜索树:随机二叉搜索树数据结构C++实现(前中后序遍历,插入,搜索,前后毗邻元素,最大最小值)
- 算法导论程序6--随机算法(Python)
- 二叉排序树(Binary Sort Tree,二叉查找树,二叉搜索树)--【算法导论】
- 二叉搜索树(算法导论第12章)
- 「算法导论」:到底什么是循环不变式?
- 【算法导论】动态规划之“最优二叉搜索树”
- 【算法导论学习-27】动态规划经典问题01:钢条切割的最大收益
- MIT:算法导论——9.二叉搜索树
- 二叉搜索树(算法导论)
- 和算法导论没什么关系0.手电筒过桥问题详解
- 实现算法导论第三版中的二叉搜索树