public classTree {private TreeNode root = null;publicTree() {
root= new TreeNode(1, "A");
}private classTreeNode {private intkey;privateString data;private booleanisVisted;privateTreeNode leftChild;privateTreeNode rightChild;public TreeNode(intkey, String data) {this.key =key;this.data =data;this.leftChild = null;this.rightChild = null;this.isVisted = false;
}
}/*** 创建一颗二叉树
* A
* B C
* D E F
* createBinTree:().
*@author*@paramroot*/
public voidcreateBinTree(TreeNode root) {
TreeNode newNodeB= new TreeNode(2, "B");
TreeNode newNodeC= new TreeNode(3, "C");
TreeNode newNodeD= new TreeNode(4, "D");
TreeNode newNodeE= new TreeNode(5, "E");
TreeNode newNodeF= new TreeNode(6, "F");
root.leftChild=newNodeB;
root.rightChild=newNodeC;//newNodeC.rightChild = newNodeF;//newNodeB.leftChild = newNodeD;//newNodeB.rightChild = newNodeE;
root.rightChild.rightChild =newNodeF;
root.leftChild.leftChild=newNodeD;
root.leftChild.rightChild=newNodeE;
}public booleanisEmpty() {return root == null;
}//树的高度
public intheight() {returnheight(root);
}//节点个数
public intsize() {returnsize(root);
}private intheight(TreeNode subTree) {if (subTree == null)return 0;int i =height(subTree.leftChild);int j =height(subTree.rightChild);return i < j ? j + 1 : i + 1;
}private intsize(TreeNode subTree) {if (subTree == null)return 0;return 1 + size(subTree.leftChild) +size(subTree.rightChild);
}//返回双亲节点
publicTreeNode parent(TreeNode element) {return (root == null || root ==element)? null: parent(root, element);
}publicTreeNode parent(TreeNode subTree, TreeNode element) {if (subTree == null)return null;if (subTree.leftChild == element || subTree.rightChild ==element) {//返回父节点地址
returnsubTree;
}
TreeNode p;//先在左子树中查找,如果左子树中没有找到,则到右子树中查找
if ((p = parent(subTree.leftChild, element)) != null)return p; //递归左子树中搜索
else
returnparent(subTree.rightChild, element);
}publicTreeNode getLeftChildNode(TreeNode element) {return element != null ? element.leftChild : null;
}publicTreeNode getRightChildNode(TreeNode element) {return element != null ? element.rightChild : null;
}publicTreeNode getRoot() {returnroot;
}//在释放某个节点时,该节点的左右子树都已经释放,//所以应该采用后续遍历,当访问某个节点时将该节点的存储空间释放
public voiddistroy(TreeNode subTree) {//删除根为subTree的子树
if (subTree != null) {//删除左子树
distroy(subTree.leftChild);//删除右子树
distroy(subTree.rightChild);//删除根节点
subTree = null;
}
}public voidtraverse(TreeNode subTree) {
System.out.println("key:" + subTree.key + "--name:" +subTree.data);
traverse(subTree.leftChild);
traverse(subTree.rightChild);
}//前序遍历
public voidperOrder(TreeNode subTree) {if (subTree != null) {
visted(subTree);
perOrder(subTree.leftChild);
perOrder(subTree.rightChild);
}
}//中序遍历
public voidinOrder(TreeNode subTree) {if (subTree != null) {
perOrder(subTree.leftChild);
visted(subTree);
perOrder(subTree.rightChild);
}
}//后序遍历
public voidpostOrder(TreeNode subTree) {if (subTree != null) {
perOrder(subTree.leftChild);
perOrder(subTree.rightChild);
visted(subTree);
}
}//将二叉树镜面对称
public voidmirror(TreeNode subTree) {if (subTree == null)return;
TreeNode node= newTreeNode(subTree.key, subTree.data);
node.leftChild=subTree.leftChild;
subTree.leftChild=subTree.rightChild;
subTree.rightChild=node.leftChild;
mirror(subTree.leftChild);
mirror(subTree.rightChild);
}public voidvisted(TreeNode subTree) {
subTree.isVisted= true;
System.out.println("key:" + subTree.key + "---data:" +subTree.data);
}//测试
public static voidmain(String[] args) {
Tree bt= newTree();
bt.createBinTree(bt.root);
System.out.println(bt.size()+ "---size");
System.out.println(bt.height()+ "---height");
System.out.println("**************前序遍历************");
bt.perOrder(bt.root);
System.out.println("************镜面对称**前序遍历************");
bt.mirror(bt.root);
bt.perOrder(bt.root);//System.out.println("**************中序遍历************");//bt.inOrder(bt.root);//
//System.out.println("**************后序遍历************");//bt.postOrder(bt.root);
}
}