删除二叉树结点

删除结点是二叉树操作中最复杂的。在删除之前首先要查找要删除的结点。找到结点后,这个要删除的结点可能会有三种情况需要考虑。

1. 该节点是叶子结点,没有子结点

要删除叶子结点,只需要改变该节点的父结点的引用值,将指向该节点的引用值设置为null就可以了。

2. 该节点有一个子结点

改变父结点的引用,将其直接指向要删除结点的子结点。

3. 该节点有两个子结点

要删除有两个子结点的结点,就需要使用它的中序后继来替代该节点。

二叉树结点

/** 二叉树结点*/
public class Node {//数据项public long data;public String sData;//左子结点public Node leftChild;//右子结点public Node rightChild;/** 构造函数*/public Node(long data,String sData){this.data=data;this.sData=sData;}}

二叉树类

* 二叉树类*/
/** 为什么要使用树* * 有序数组插入数据项和删除数据项太慢* 链表查找数据太慢* 在树中能非常快速的查找数据项、删除数据项和插入数据项*/public class Tree {//根结点public Node root;/** 插入结点*/public void insert(long value,String sValue){//封装结点Node newNode=new Node(value,sValue);//引用当前结点Node current=root;//引用父结点Node parent;//如果root为null,也就是第一插入的时候if(root==null){root=newNode;return;}else{while(true){//父结点指向当前结点parent=current;//如果当前指向的结点数据比插入的要大,则向左走if(current.data>value){current=current.leftChild;if(current==null){parent.leftChild=newNode;return;}}else{current=current.rightChild;if(current==null){parent.rightChild=newNode;return;}}}}}/** 查找结点*/public Node find(long value){//引用当前结点,从跟结点开始Node current=root;//循环,只要查找值不等于当前结点的数据项while(current.data!=value){//进行比较,比较查找值和当前结点的大小if(current.data>value){current=current.leftChild;}else{current=current.rightChild;}//如果找不到if(current==null){return null;}}return current;}/** 删除结点* * 1 该节点是叶子节点,没有子节点* 要删除叶结点,只需要改变该节点的父结点的引用值,将指向该节点的引用设置为null就可以了* * 2 该节点有一个子节点* 改变父结点的引用,将其直接指向要删除结点的子节点* * 3 该节点有两个子节点* 要删除有两个子节点的结点,就需要使用它的中序后继来代替该节点**/public boolean delete(long value){//引用当前结点,从根节点开始Node current=root;//引用当前结点的父结点Node parent=root;//是否为左结点boolean isLeftChild=true;while(current.data!=value){parent=current;//进行比较,比较查找值和当前结点的大小if(current.data>value){current=current.leftChild;isLeftChild=true;}else{current=current.rightChild;isLeftChild=false;}//如果找不到if(current==null){return false;}}//删除叶子结点,也即该节点没有子结点if(current.leftChild==null&¤t.rightChild==null){if(current==root){root=null;}//如果它是父结点的左子结点else if(isLeftChild){parent.leftChild=null;}else{parent.rightChild=null;}}else if(current.rightChild==null){if(current==root){root=current.leftChild;}else if(isLeftChild){parent.leftChild=current.leftChild;}else{parent.rightChild=current.leftChild;}}else if(current.leftChild==null){if(current==root){root=current.rightChild;}else if(isLeftChild){parent.leftChild=current.rightChild;}else{parent.rightChild=current.rightChild;}}else{Node successor=getSuccessor(current);if(current==root){root=successor;}else if(isLeftChild){parent.leftChild=successor;}else{parent.rightChild=successor;}successor.leftChild=current.leftChild;}return true;}public Node getSuccessor(Node delNode){Node successor=delNode;Node successorParent=delNode;Node current=delNode.rightChild;while(current!=null){successorParent=successor;successor=current;current=current.leftChild;}if(successor!=delNode.rightChild){successorParent.leftChild=successor.rightChild;successor.rightChild=delNode.rightChild;}return successor;}/** 前序遍历*/public void frontOrder(Node localNode){if(localNode!=null){//访问根结点System.out.println(localNode.data+","+localNode.sData);//前序遍历左子树frontOrder(localNode.leftChild);//前序遍历右子树frontOrder(localNode.rightChild);}}/** 中序遍历*/public void inOrder(Node localNode){if(localNode!=null){//中序遍历左子树inOrder(localNode.leftChild);//访问根结点System.out.println(localNode.data+","+localNode.sData);//中序遍历右子树inOrder(localNode.rightChild);}}/** 后序遍历*/public void afterOrder(Node localNode){if(localNode!=null){//后序遍历左子树afterOrder(localNode.leftChild);//后序遍历右子树afterOrder(localNode.rightChild);//访问根结点System.out.println(localNode.data+","+localNode.sData);}}}

测试:

public class TestTree {public static void main(String[] args) {// TODO Auto-generated method stubTree tree=new Tree();tree.insert(10,"James");tree.insert(20,"Yao");tree.insert(15,"Kobi");tree.insert(3,"Mac");tree.insert(4,"Zhangsan");tree.insert(90, "Lisi");//        System.out.println(tree.root.data);
//      System.out.println(tree.root.rightChild.data);
//      System.out.println(tree.root.rightChild.leftChild.data);
//      System.out.println(tree.root.leftChild.data);
//
//      Node node =tree.find(3);
//      System.out.println(node.data+","+node.sData);//前、中、后序遍历
//      tree.frontOrder(tree.root);
//      tree.inOrder(tree.root);
//      tree.afterOrder(tree.root);//删除叶子结点tree.delete(10);tree.inOrder(tree.root);}
}

数据结构与算法(十三)删除二叉树结点相关推荐

  1. 研磨数据结构与算法-13删除二叉树节点

    节点: /* * 二叉树节点 */ public class Node { //数据项 public long data; //数据项 public String sData; //左子节点 publ ...

  2. 数据结构与算法--死磕二叉树

    死磕二叉树 近一年都比较关注算法相关的知识,也刷了不少题,之前的文章中大多也是算法相关的文章,但是感觉每次遇到树相关的题型都不能应对自如,因此还是有必要在相关知识上下功夫,因此有此次总结,以下是所有树 ...

  3. 数据结构与算法——树和二叉树***

    第五章 :树和二叉树 树和图是两种重要的非线性结构.线性结构中结点具有唯一前驱和唯一后继的关系,而非线性结构中结点之间的关系不再具有这种唯一性.其中,树形结构中结点间的关系是前驱唯一而后继不唯一,即元 ...

  4. 【数据结构与算法基础】二叉树

    写在前面 上面一篇介绍了简单的线性的数据结构浅入浅出数据结构(二)堆栈与队列 这一篇研究一些复杂的数据结构:树和二叉树. 1.二叉树简介 二叉树是一种最简单的树形结构,其特点是树中每个结点至多关联到两 ...

  5. 【数据结构与算法基础】二叉树与其遍历序列的互化 附代码实现(C和java)

    前言 数据结构,一门数据处理的艺术,精巧的结构在一个又一个算法下发挥着他们无与伦比的高效和精密之美,在为信息技术打下坚实地基的同时,也令无数开发者和探索者为之着迷. 也因如此,它作为博主大二上学期最重 ...

  6. 数据结构与算法-- 广度优先打印二叉树

    广度优先打印二叉树 题目:从上往下打印出二叉树的每一个节点,同一层节点按照从左到右顺序打印,例如下图中二叉树,依次打印出是8,6,10,5,7,9,11 如上题中二叉树的节点定义我们用之前文章 二叉树 ...

  7. 常考数据结构与算法----给定一个二叉树和一个值 sum,请找出所有的根节点到叶子节点的节点值之和等于sum 的路径,

    题目描述 给定一个二叉树和一个值sum,请找出所有的根节点到叶子节点的节点值之和等于sum 的路径, 例如: 给出如下的二叉树,sum=22, 返回 [ [5,4,11,2], [5,8,9] ] 示 ...

  8. 数据结构与算法 | 树与二叉树

    树的概念 二叉树的概念 树的概念和结构 树是一种非线性的数据结构,它是由n个有限结点组成一个具有层次关系的集合,把它叫做树是因为它看起来像一棵倒挂的树,如图所示 有一个特殊的结点,称为根节点,根节点没 ...

  9. 数据结构与算法--Tree(二叉树、B±树、红黑树)

    在MySQL中,索引的的实现方式中使用的最多的就是B+Tree,那么为什么要选择B+Tree呢?我们就需要从最基本的二叉查找树说起 什么是二叉树? 二叉树 = (空树) | (节点+左右子二叉树) 解 ...

最新文章

  1. centos安装emqtt_benchmark
  2. Kubernetes Helm入门指南
  3. STL中的set容器的一点总结
  4. Python 各种读取保存tif,tiff,png,jpg,mat等格式图像方法大集合
  5. leetcode1027
  6. C++:Static修饰变量 vs Static修饰函数
  7. LeetCode 138 复制带随机指针的链表-中等
  8. tez什么意思_传统数仓和大数据数仓的区别是什么?
  9. opencv Harris角检测
  10. js+css淡入效果
  11. leetcode 172. Factorial Trailing Zeroes(阶乘的末尾有多少个0)
  12. markDown零碎整理
  13. 30岁的程序员:不拼体力的我们应该关注什么?
  14. java伪代码生成器_java伪代码怎么写
  15. sas不能安装独立的java_sas安装问题java platform standard edition runtime environment
  16. 新浪微博开放平台_Xweibo,修改设置…
  17. 基于樽海鞘群算法的线性规划求解matlab程序
  18. Proxy(代理)服务器
  19. excel组合汇总_Excel汇总20140224
  20. unity3d求一个向量的垂直方向

热门文章

  1. mysql中long_在Mysql中用 LONGBLOB 类型存储二进制数据
  2. 举三反一,一通百通的“数学脑”是怎样炼成的?
  3. 测试你潜在是天使还是魔鬼
  4. 连面包店都在用NetSuite了,你还在等什么?
  5. Servlet与Jsp的区别
  6. http://www.importnew.com/10113.html
  7. Linux Anaconda下载安装
  8. 删除数组中的某个元素的方法
  9. chatGPT专项调研报告
  10. 2.玩客云armbian5.9安装docker