春天我种下一棵二叉树,秋天就能收获很多很多二叉树~~~
关于二叉树,概念神马的不提,我们主要来谈一下二叉树的创建,遍历,插入,删除等等一系列的操作。
一、创建与遍历
创建要根据用户输入的字符串来统计每个字母出现的次数,从而作为每个字母的权值,来构建二叉树。
在进入主函数前先定义了全局变量
?
?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();?
这两行代码上!!修改中。。。
?