二叉树
二叉树(binary tree)是一棵树,其中每个节点都不能多于两个的儿子。
例子-表达式树
如图显示的就是一个表达式树的例子。
表达式树的树叶是操作数(如常数或变量名),而其他节点为操作符。
中序遍历(左、节点、右)[递归地产生一个左表达式,然后打印出在根处的运算符,最后再递归的产生一个带括号的右表达式而得到一个中缀表达式]:
(a+(b * c))+(((d*e)+f)*g)
后序遍历(在后序遍历中,一个节点的处理工作是在它的诸儿子节点被计算后进行的)[递归的打印出左子树、右子树、运算符]:
abc*+defg*+*+
先序遍历(在先序遍历中,对节点的处理工作是在它诸儿子节点被处理之前进行的)[先打印出运算符,然后递归的打印出左子树、右子树]:
++a*bc*+*defg
构造表达式树
1. 如果符号是操作数,那么建立一个单节点树并将它推入栈中
2. 如果符号是操作符,那么就从栈中弹出两颗树T1和T2(T1先弹出)并形成一颗新的树,该树的根就是操作符,它的左、右儿子分别是T2和T1
3. 将新树压入栈中
查找树ADT
使二叉树成为查找树的性质:对于树中的每个节点X,它的左子树中的所有的项的值小于X中的项,而它的右子树中所有项的值大于X中的项。
二叉查找树要求所有的项都能够排序。
contains方法
findMin和findMax方法
insert方法
remove 方法
- 如果节点是一片树叶,那么它可以被立即删除
- 如果节点有一个儿子,则该节点可以在其父节点调整自己的链以绕过该节点后删除
- 复杂情况是处理有两个儿子的节点。一般的删除策略是用其右子树的最小的数据代替该节点的数据并递归地删除那个节点。