查找二叉树删除节点的操作
来源:互联网 发布:淘宝2017秋款裙子 编辑:程序博客网 时间:2024/04/29 23:22
二叉查找树中,最复杂的操作就是删除操作。对于叶子节点,直接删除即可。对于一颗子树的节点,用子树取代原节点即可。对于拥有两颗子树的节点,首先用右子树最小的节点取代源节点,再递归删除此最小节点。
具体代码如下所示:
package com.Algorithm.Tree;import java.util.*;import java.io.*;/* * author:Tammy Pi * function:二叉查找树 */public class BiSearchTree {public TreeNode root=null;private Scanner scanner=null;public BiSearchTree(){scanner=new Scanner(System.in);}public TreeNode getRoot() {return root;}public void setRoot(TreeNode root) {this.root = root;}public Scanner getScanner() {return scanner;}public void setScanner(Scanner scanner) {this.scanner = scanner;} public void createTree() { this.root=createTree(this.root); } public void midTraverse() { midTraverse(this.root); } //中序遍历,相当于排序 public void midTraverse(TreeNode root) { if(root!=null) { midTraverse(root.getLchild()); System.out.print(root.getData()+" "); midTraverse(root.getRchild()); } }//建立二叉查找树public TreeNode createTree(TreeNode root){String str=scanner.next();int n=Integer.parseInt(str);for(int i=0;i<n;i++){String data=scanner.next();if(root==null){root=new TreeNode(data);}else {TreeNode node=new TreeNode(data);TreeNode x=root,y=root;while(x!=null){if(x.getData().compareTo(node.getData())>0){y=x;x=x.getLchild();}else {y=x;x=x.getRchild();}}if(y.getData().compareTo(node.getData())>0){y.setLchild(node);}else{y.setRchild(node);}}}//for ireturn root;}//createTree//查找最小的节点public TreeNode findMin(TreeNode node){TreeNode x=node;while(node!=null){x=node;node=node.getLchild();}return x;}public void testRemove(){root.setRchild(remove(root.getRchild(),root.getRchild()));System.out.print("删除节点后,中序遍历结果为:"); midTraverse();}//删除节点//node为待删除节点public TreeNode remove(TreeNode node,TreeNode subTree){if(subTree==null){return null;}int state=node.getData().compareTo(subTree.getData());if(state<0){node.setLchild(remove(node,subTree.getLchild()));}else if(state>0){node.setRchild(remove(node,subTree.getRchild()));}else if(node.getLchild()!=null&&node.getRchild()!=null){TreeNode temp=findMin(node.getRchild());node.setData(temp.getData());node.setRchild(remove(temp,node.getRchild()));}else{node=(node.getLchild()!=null?node.getLchild():node.getRchild());}return node;}//用于测试的主函数public static void main(String[] args){BiSearchTree biTree=new BiSearchTree();biTree.createTree();System.out.println("查找二叉树建立完成!");System.out.print("中序遍历结果为:");biTree.midTraverse();System.out.println();biTree.testRemove();}}
- 查找二叉树删除节点的操作
- 二叉查找树的创建及删除节点操作
- 二叉查找树中节点的删除。
- 删除二叉查找树的节点-LintCode
- 删除二叉查找树的节点
- 删除二叉查找树的节点
- 删除二叉查找树的节点
- 二叉查找树中节点的删除
- LintCode:删除二叉查找树的节点
- LintCode : 删除二叉查找树的节点
- 二叉查找树节点的删除
- 删除二叉查找树的节点
- 删除二叉查找树的节点-LintCode
- 删除二叉查找树的节点
- 二叉查找树中节点的删除
- 二叉查找树删除节点
- 二叉查找树节点的查找、插入和删除
- 二叉查找树的删除操作
- Erlang动态编译热替换
- javascript中parseInt函数
- handler 文件上传
- 在3ds max中,用opacity map制作真实的叶子
- 第九周实验报告任务4 建立一个二维数组类Douary,使该类中有以下数据成员、成员函数及友员函数,完成矩阵的输入、输出、加、减、相等判断等操作。
- 查找二叉树删除节点的操作
- 生产Google Sitemap XML文件的PHP代码
- 王小波全集
- 第九周任务2
- 第九周任务(三)
- 在MFC的Picture控件上画线和框
- mapgis6.7二次开发vc6_demo 之一(主窗体构架)
- JavaScript 零散笔记
- linux命令总结