二叉树的实现 Java版

来源:互联网 发布:知乎的应用场景 编辑:程序博客网 时间:2024/06/11 23:52

二叉树的操作接口


package tree;/** * 树的操作 *  * @author liangguojun *  * @param <T> *            数据类型 */public interface SQTree<T> {/** * 判断该树是否为空 *  * @return 该树为空则返回true,否则返回false */public boolean isEmpty();/** * 清空树的所有数据元素 */public void clear();/** * 返回树的深度 *  * @return 返回树的深度 */public int getDept();/** * 返回节点cur的数据元素 *  * @param cur *            树中的节点 * @return 返回节点cur的数据元素,若该节点不存在则返回null */public T getValue(TNode<T> cur);/** * 返回节点cur的双亲节点 *  * @param cur *            树中的节点 *  * @return 返回cur的双亲节点,若不存在双亲节点,则返回null */public TNode<T> getParent(TNode<T> cur);/** * 返回节点点cur的左孩子节点 *  * @param cur *            树中的节点 * @return 返回cur节点的左孩子,若不存在左孩子节点则返回null */public TNode<T> getLChild(TNode<T> cur);/** * 返回即诶但cur的右孩子节点 *  * @param cur *            树中的节点 * @return 返回cur节点中的右孩子,若不存在右孩子则返回null */public TNode<T> getRChild(TNode<T> cur);/** * 返回cur节点兄弟 *  * @param cur *            树中的节点 * @return 返回cur节点的兄弟,若不存在则返回null */public TNode<T> getBrother(TNode<T> cur);/** * 删除一颗子树,并返回 *  * @param cur *            子树节点 * @return 返回被删除的子树 */public void deleteTree(TNode<T> cur);/** * 删除树中的一个节点 *  * @param cur *            树中的一个节点 * @return 返回被删除节点的数据元素,若不存在这个节点,则返回null */public T deleteNode(TNode<T> cur);}

二叉树的实现,省略节点类


package tree;//前一篇的队列实现import queue.*;/** * 二叉树的实现 * @author liangguojun * * @param <T> */public class BiTree<T> implements SQTree<T> {private TNode<T> root;public BiTree() {root = null;}public TNode<T> getRoot() {return root;}@Overridepublic boolean isEmpty() {if (root == null) {return true;}return false;}@Overridepublic void clear() {this.root = null;}private int getDept(TNode<T> node) {if (node != null) {// 递归遍历左右子树的层数int lc = this.getDept(node.getlChild()) + 1;int rc = this.getDept(node.getrChild()) + 1;return lc > rc ? lc : rc;}return 0;}@Overridepublic int getDept() {return getDept(root);}@Overridepublic T getValue(TNode<T> cur) {if (cur != null) {return cur.getData();}return null;}private TNode<T> getParent(TNode<T> root, TNode<T> cur) {if (root != null) {if (root.getlChild() == cur | root.getrChild() == cur) {return root;}TNode<T> lt = this.getParent(root.getlChild(), cur);TNode<T> rt = this.getParent(root.getrChild(), cur);// 如果左子树返回的父母节点为空则返回右子树的双亲节点,否则返回左子树的父母节点return lt == null ? rt : lt;}return null;}@Overridepublic TNode<T> getParent(TNode<T> cur) {if (cur != null) {return this.getParent(root, cur);}return null;}@Overridepublic TNode<T> getLChild(TNode<T> cur) {if (cur != null) {return cur.getlChild();}return null;}@Overridepublic TNode<T> getRChild(TNode<T> cur) {if (cur != null) {return cur.getrChild();}return null;}@Overridepublic TNode<T> getBrother(TNode<T> cur) {if (cur != null) {TNode<T> parent = this.getParent(root, cur);if (parent != null) {// 假如双亲节点的左孩子等于cur,则返回双亲的右孩子,否则返回左孩子return parent.getlChild() == cur ? parent.getrChild() : parent.getlChild();}}return null;}@Overridepublic void deleteTree(TNode<T> cur) {if (cur != null) {// 找到该节点的双亲节点TNode<T> parent = this.getParent(root, cur);if (parent.getlChild() == cur) {parent.setlChild(null);} else {parent.setrChild(null);}}return;}@Overridepublic T deleteNode(TNode<T> cur) {if (cur != null) {TNode<T> parent = this.getParent(root, cur);TNode<T> tmp = cur;TNode<T> rem = null;if (cur.getrChild() != null)rem = cur.getrChild();else if (cur.getlChild() != null)rem = cur.getlChild();if (rem != null) {// 找到该子树的右端点,作为替代节点while ((tmp.getrChild() != null || tmp.getlChild() != null)&& (rem.getrChild() != null || rem.getlChild() != null)) {tmp = rem;if (rem.getrChild() != null) {rem = rem.getrChild();} else if (rem.getlChild() != null)rem = rem.getlChild();}// 删除右端点if (tmp.getlChild() == rem) {tmp.setlChild(null);} elsetmp.setrChild(null);// 右端点代替被删除的节点rem.setlChild(cur.getlChild());rem.setrChild(cur.getrChild());}// 修改双亲节点的孩子if (parent.getlChild() == cur) {parent.setlChild(rem);} else {parent.setrChild(rem);}return cur.getData();}return null;}/** * 先序遍历二叉树 *  * @param cur *            二叉树的根节点 */private void viewF(TNode<T> cur) {if (cur != null) {System.out.print(cur.getData() + " ");this.viewF(cur.getlChild());this.viewF(cur.getrChild());}}/** * 先序遍历二叉树 */public void viewFirst() {System.out.println("先序遍历:");viewF(root);System.out.println();}/** * 中序遍历二叉树 *  * @param cur *            树的根节点 */private void viewC(TNode<T> cur) {if (cur != null) {this.viewC(cur.getlChild());System.out.print(cur.getData() + " ");this.viewC(cur.getrChild());}return;}/** * 中序遍历二叉树 */public void viewC() {System.out.println("中序遍历:");this.viewC(root);System.out.println();}/** * 后序遍历二叉树 *  * @param cur *            树的根节点 */private void viewL(TNode<T> cur) {if (cur != null) {this.viewL(cur.getlChild());this.viewL(cur.getrChild());System.out.print(cur.getData() + " ");}return;}/** * 后序遍历二叉树 */public void viewLast() {System.out.println("后序遍历:");this.viewL(root);System.out.println();}/** * 按层次遍历二叉树 */public void cengci() {LinkedQueue<TNode<T>> treeQueue = new LinkedQueue<>();treeQueue.enQueue(root);TNode<T> tmp;System.out.println("层次遍历:");while (!treeQueue.isEmpty()) {// 队列元素出栈tmp = treeQueue.deQueue();System.out.print(tmp.getData() + " ");// 假如左孩子不为空,则左孩子入栈if (tmp.getlChild() != null)treeQueue.enQueue(tmp.getlChild());// 假如右孩子不为空,则右孩子入栈if (tmp.getrChild() != null)treeQueue.enQueue(tmp.getrChild());}System.out.println();}public static BiTree<String> init() {BiTree<String> bitree = new BiTree<>();TNode<String> child_f, child_d, child_b, child_c;child_d = new TNode<String>("D", null, new TNode<String>("G"));child_b = new TNode<String>("B", child_d, null);child_f = new TNode<String>("F", new TNode<String>("H"), null);child_c = new TNode<String>("C", new TNode<String>("E"), child_f);bitree.root = new TNode<String>("A", child_b, child_c);return bitree;}//测试二叉树public static void main(String[] args) {BiTree<String> test = init();test.cengci();// test.viewC();// test.viewFirst();// test.viewLast();// test.clear();System.out.println("二叉树是否为空?:" + test.isEmpty());System.out.println("二叉树的深度为?:" + test.getDept());TNode<String> cur = test.getRoot();// 删除一个节点,寻找右子树的端点代替该节点// test.deleteNode(cur.getlChild());// 删除一个子树// test.deleteTree(cur.getrChild());// test.cengci();System.out.println("B的兄弟是?:" + test.getBrother(cur.getrChild()));}}






原创粉丝点击