二叉树的一些操作
二.二叉排序树
1.查找
分析:
比如要查找6,
root先指向根节点8,
因为(6<8),所以root指向8的左边子节点 3
又(6>3),所以root指向3的右子节点 6
查找完成。
左子节点用child,右子节点用sibling
代码如下:
左子节点用child,右子节点用sibling
/**
* 二叉排序树的查找操作
* @param root 根节点
* @param data 待查找的元素
* @return
*/
public Boolean search(Node_cp root ,int data){
while(root != null){
if(data == root.data){
return true;
}
if(data < root.data){
root = root.child;
}else{
root = root.sibling;
}
}
return false;
}
#### 2.插入
插入和查找很像,再加上一个prev——记录待待插入结点的父节点(上个结点)
点击查看代码/**
* 二叉排序树的插入操作
* @param root
* @param data
*/
public void insert(Node_cp root,int data){
Node_cp prev = null;//
while(root != null){
prev = root;
if(data < root.data){
root = root.child;
}
else if(data > root.data){
root = root.sibling;
}else{
return;
}
}
//此时root指向null,prev指向要插入结点的父节点,即root的上一个结点
if(prev.data > data){
prev.child = new Node_cp(data);
}else{
prev.sibling = new Node_cp(data);
}
}
#### 3.删除操作
分析:
-
待删结点只有一个左或右子节点
将子节点重新连入被删除处即可 -
待删结点是叶子结点,就直接删
-
待删除结点有左右两个结点
比如删除上图中的8(根节点)
按中序排序的话该图是: 134678 9 10 13 14
所以,可以将7或者9填充到8这个位置上。
因此
先找到待删结点的左子树的最大值(7),将其替换上去
或者(…)
找右子树的最小值(9)替换上去。
这么操作,将不会破坏二叉排序树的规则。
/**
* 二叉树删除操作
* @param root 根节点
* @param data 待删数据
* @return
*/
public Boolean delete(Node_cp root,int data){
if (root == null){
return false;
}else{
if(data == root.data){
return
}
}
}
/**
* 删除结点
* @param node 待删结点
* @return
*/
public Boolean deleteNode(Node_cp node){
Node_cp temp = null;//
/**1.node就是根节点
* 2.node仅有一个左右子节点
* 3.node有两个左右子节点
*
*/
//说实话目前不清楚这个temp是干嘛的,指向node的父节点
if(node.sibling == null){
temp = node;
node = node.child;
}else if(node.child == null){
temp = node;
node = node.sibling;
}else{
temp = node;
Node_cp s = node;
//2. s来找左子树的最大值,(代删结点的右子树的最小值也可以)
s = s.child;
while(s.sibling != null){
temp = s;
s = s.sibling;
}
node.data = s.data;
//3. 接下来处理s节点被移的后续问题
/**
* 1.当temp(s结点的父节点) 不是node
* 2. 就是node
*/
if(temp != node){
//情况1,temp的右子节点没了
temp.sibling = s.child;//这里用s的左结点,是因为s本身就是最大值了,最多有左子节点
}else{
//情况2,temp的左子节点替换上来了,没了
temp.child = s.child;
}
}
return true;
}