读书人

春天小弟我种下一棵二叉树秋天就能收

发布时间: 2013-08-09 15:16:24 作者: rapoo

春天我种下一棵二叉树,秋天就能收获很多很多二叉树~~~

关于二叉树,概念神马的不提,我们主要来谈一下二叉树的创建,遍历,插入,删除等等一系列的操作。

一、创建与遍历

创建要根据用户输入的字符串来统计每个字母出现的次数,从而作为每个字母的权值,来构建二叉树。

在进入主函数前先定义了全局变量

?

?2.创建二叉树的方法

?看了这三种递归实现的遍历,有对比上面的非递归算法,应了我上一篇总结的话,递归实在是灰常灰常有用的东东!!!

4、最后是节点类

// ---------------------------根据值删除----------------------------------   public boolean delete(int key) // 根据值删除      {                           // (assumes non-empty list)      Node current = root;      Node parent = root;      boolean isLeftChild = true;      while(current.iData != key)        // 寻找节点,不相等就一直找         {         parent = current;         if(key < current.iData)         // 若值小于当前结点所存的值,向左转            {            isLeftChild = true;//标记自己是父节点的左子结点还是右子节点            current = current.leftChild;            }         else                            // or go right?            {            isLeftChild = false;            current = current.rightChild;            }         if(current == null)             // 到达左边线的最下端            return false;                // 没找到返回false         }  //退出了while意味着找到了对应节点      // 若没有子节点,则直接删除      if(current.leftChild==null &&                                   current.rightChild==null)         {         if(current == root)             //半段是否为根节点            root = null;                 // 清空树         else if(isLeftChild)            parent.leftChild = null;     // disconnect         else                            // from parent            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  // 有两个子节点则:         {         // get successor of node to delete (current)         Node successor = getSuccessor(current);         // connect parent of current to successor instead         if(current == root)            root = successor;         else if(isLeftChild)            parent.leftChild = successor;//用于调整位置的方法         else            parent.rightChild = successor;         // connect successor to current's left child         successor.leftChild = current.leftChild;         }  // end else two children      // (successor cannot have a left child)      return true;                                // success      }  // end delete()// -------------------------   // 返回被删除节点的子节点中的最大值   // 从右边开始   private Node getSuccessor(Node delNode)      {      Node successorParent = delNode;      Node successor = delNode;      Node current = delNode.rightChild;   // go to right child      while(current != null)               // until no more         {                                 // left children,         successorParent = successor;         successor = current;         current = current.leftChild;      // go to left child         }                                           // if successor not      if(successor != delNode.rightChild)  // right child,         {                                 // make connections         successorParent.leftChild = successor.rightChild;         successor.rightChild = delNode.rightChild;         }      return successor;      }

?

大神用了两个方法来实现,一个是删除掉节点,一个是在他的子节点中找到最大的那一个,用来替换他的位置,我还知道了这个代码来自于清华的数据结构课件~~清华计算机学院果然强大~拜倒个~

目前二叉树就是现在这个样子,删除等我完善~~

上面那个遍历跟创建看上去如此流畅完美的代码,但却报错了!!传说中的空指针异常!!就在

??????? for(int i=0,len=array.length;i<len;i++)

?????? ??????? tree.createBinTree();?

这两行代码上!!修改中。。。

?

读书人网 >编程

热点推荐