标签:java 使用 io for art ar new amp
package com.iflytek.tree; import java.util.Random; /** * 二叉查找树 * @author fgtian * */ public class BinaryTree { public static class BinaryTreeNode { int mValue; // 数值:以int代替,可以扩展成其他的 BinaryTreeNode mLeftNode; BinaryTreeNode mRightNode; BinaryTreeNode mParent; BinaryTreeNode(int value, BinaryTreeNode parent) { mValue = value; mParent = parent; } } private BinaryTreeNode mHeader; public BinaryTree() { } public void insert(int value) { if (null == mHeader) { mHeader = new BinaryTreeNode(value, null); mHeader.mLeftNode = mHeader.mRightNode = null; } else { // 找到它的父节点: BinaryTreeNode p = mHeader; while (true) { int curValue = p.mValue; if (value <= curValue) { BinaryTreeNode left = p.mLeftNode; if (null == left) { BinaryTreeNode node = new BinaryTreeNode(value, p); node.mLeftNode = node.mRightNode = null; p.mLeftNode = node; return; } else { p = left; } } else { BinaryTreeNode right = p.mRightNode; if (null == right) { BinaryTreeNode node = new BinaryTreeNode(value, p); node.mLeftNode = node.mRightNode = null; p.mRightNode = node; return; } else { p = right; } } } } } public BinaryTreeNode find(int value) { BinaryTreeNode node = mHeader; return findNode(node, value); } private BinaryTreeNode findNode(BinaryTreeNode startNode, int value) { BinaryTreeNode node = startNode; while (null != node) { if (node.mValue == value) { return node; } else if (value > node.mValue) { node = node.mRightNode; } else { node = node.mLeftNode; } } return null; } public void printLevel() { System.out.println("======================================="); printLevelNode(mHeader, 0); System.out.println("======================================="); } private void printLevelNode(BinaryTreeNode node, int level) { if (null != node) { for (int i = 0; i < level; i++) { System.out.print(" "); } System.out.println(String.valueOf(node.mValue)); printLevelNode(node.mLeftNode, level + 1); printLevelNode(node.mRightNode, level + 1); } } public void print() { printNode(mHeader); } private void printNode(BinaryTreeNode node) { if (null != node) { printNode(node.mLeftNode); System.out.print(" " + node.mValue); printNode(node.mRightNode); } } public int findMin() { if (null == mHeader) { throw new IllegalStateException("树为空"); } BinaryTreeNode node = findMinNode(mHeader); return node.mValue; } private BinaryTreeNode findMinNode(BinaryTreeNode startNode) { BinaryTreeNode node = startNode; while (null != node.mLeftNode) node = node.mLeftNode; return node; } public int findMax() { if (null == mHeader) { throw new IllegalStateException("树为空"); } BinaryTreeNode node = findMaxNode(mHeader); return node.mValue; } private BinaryTreeNode findMaxNode(BinaryTreeNode startNode) { BinaryTreeNode node = startNode; while (null != node.mRightNode) node = node.mRightNode; return node; } public void remove(int value) { BinaryTreeNode node = findNode(mHeader, value); if (null == node) { return; } removeNode(node); } private void removeNode(BinaryTreeNode node) { if (null == node.mLeftNode || null == node.mRightNode) { BinaryTreeNode parent = node.mParent; if (null == parent) { // 删除的是根节点 BinaryTreeNode header = mHeader; if (null == node.mLeftNode && null == node.mRightNode) { // 两边为空 mHeader = null; } else if (null == node.mLeftNode) { // 左边为空 mHeader = node.mRightNode; } else { mHeader = node.mLeftNode; } header.mLeftNode = header.mRightNode = null; } else { if (null == node.mLeftNode && null == node.mRightNode) { // 这是一个叶子 if (parent.mLeftNode == node) { parent.mLeftNode = null; } else if (parent.mRightNode == node) { parent.mRightNode = null; } else { throw new IllegalStateException("父节点的两个孩子接口都不等于孩子"); } } else if (null != node.mLeftNode) { // 左边存在 parent.mLeftNode = node.mLeftNode; node.mParent = parent; } else { parent.mLeftNode = node.mRightNode; node.mParent = parent; } } } else { // 使用右边最大的进行替换: BinaryTreeNode maxNode = findMaxNode(node); int value = maxNode.mValue; node.mValue = value; removeNode(maxNode); } } public static void main(String[] args) { BinaryTree tree = new BinaryTree(); Random r = new Random(10); int length = 10; int value = 0; for (int i = 0; i < length; i++) { value = r.nextInt(1000); tree.insert(value); } tree.print(); BinaryTreeNode node = tree.find(value); if (null != node) { System.out.println("\nFind Value: " + node.mValue); // 把value到跟依次打印出来: System.out.println("从node到根的路径:"); while (node != null) { System.out.print(" " + node.mValue); node = node.mParent; } } else { System.out.println("\nCANNOT Find Value: " + value); } int maxValue = tree.findMax(); int minValue = tree.findMin(); System.out.println("\n最大值:" + maxValue + ", 最小值:" + minValue); tree.printLevel(); tree.remove(293); tree.printLevel(); } }
标签:java 使用 io for art ar new amp
原文地址:http://blog.csdn.net/buleriver/article/details/38358423