packagetree;importjava.util.ArrayList;importjava.util.LinkedList;importjava.util.List;importjava.util.Queue;/*** TreeTools:树的操作类
*
*@authorxuejupo jpxue@travelsky.com
*
* create in 2015-11-19 下午5:31:05
**/
public classTreeTools {/*** getTreeNum: 判断树中节点个数
*
*@paramroot
* 根节点
*@returnint 返回类型*/
public static int getTreeNum(TreeNoderoot) {if (root == null) {return 0;
}return getTreeNum(root.leftChild) + getTreeNum(root.rightChild) + 1;
}/*** getTreeDepth: 判断树的深度
*
*@paramroot
* 根节点
*@returnint 返回类型*/
public static int getTreeDepth(TreeNoderoot) {if (root == null) {return 0;
}int leftDepth = getTreeDepth(root.leftChild) + 1;int rightDepth = getTreeDepth(root.rightChild) + 1;returnMath.max(leftDepth, rightDepth);
}/*** preOrderTravel: 前序遍历
*
*@paramroot
* void 返回类型*/
public static void preOrderTravel(TreeNoderoot) {if (root == null) {return;
}
visitNode(root);
preOrderTravel(root.leftChild);
preOrderTravel(root.rightChild);
}/*** midOrderTravel: 中序遍历
*
*@paramroot
* void 返回类型*/
public static void midOrderTravel(TreeNoderoot) {if (root == null) {return;
}
midOrderTravel(root.leftChild);
visitNode(root);
midOrderTravel(root.rightChild);
}/*** backOrderTravel: 后序遍历
*
*@paramroot
* void 返回类型*/
public static void backOrderTravel(TreeNoderoot) {if (root == null) {return;
}
backOrderTravel(root.leftChild);
backOrderTravel(root.rightChild);
visitNode(root);
}/*** visitNode: 访问node节点
*
*@paramnode
* void 返回类型*/
private static void visitNode(TreeNodenode) {
System.out.print(node.value+ "\t");
}/*** levelTravel: 分层遍历
*
*@paramroot
* void 返回类型*/
public static void levelTravel(TreeNoderoot) {
Queue> q = new LinkedList>();
q.offer(root);while (!q.isEmpty()) {
TreeNode temp =q.poll();
visitNode(temp);if (temp.leftChild != null) {
q.offer(temp.leftChild);
}if (temp.rightChild != null) {
q.offer(temp.rightChild);
}
}
}/*** getNumForKlevel: 求第K层节点个数
*
*@paramroot
*@paramk
*@returnint 返回类型*/
public static int getNumForKlevel(TreeNode root, intk) {if (root == null || k < 1) {return 0;
}if (k == 1) {return 1;
}int leftNum = getNumForKlevel(root.leftChild, k - 1);int rightNum = getNumForKlevel(root.rightChild, k - 1);return leftNum +rightNum;
}/*** getLeafNum: 求二叉树中叶子节点的个数
*
*@paramroot
*@returnint 返回类型*/
public static int getLeafNum(TreeNoderoot) {if (root == null) {return 0;
}if (root.leftChild == null && root.rightChild == null) {return 1;
}int leftNum =getLeafNum(root.leftChild);int rightNum =getLeafNum(root.rightChild);return leftNum +rightNum;
}/*** exchange: 交换根节点的左右子树
*
*@paramroot
*@returnTreeNode 返回类型*/
public static TreeNode exchange(TreeNoderoot) {if (root == null) {return null;
}
TreeNode left =exchange(root.leftChild);
TreeNode right =exchange(root.rightChild);
root.leftChild=right;
root.rightChild=left;returnroot;
}/*** nodeIsChild: 查看node是否是root的子节点
*
*@paramroot
*@paramnode
*@returnboolean 返回类型*/
public static boolean nodeIsChild(TreeNode root, TreeNodenode) {if (root == null || node == null) {return false;
}if (root ==node) {return true;
}boolean isFind =nodeIsChild(root.leftChild, node);if (!isFind) {
isFind=nodeIsChild(root.rightChild, node);
}returnisFind;
}/*** findAllFatherNode: 返回两个节点lnode和rnode的以root为根节点的公共父节点
*
*@paramroot
* 根节点
*@paramlNode
*@paramrNode
*@returnTreeNode 返回类型*/
public static TreeNode findAllFatherNode(TreeNoderoot,
TreeNode lNode, TreeNoderNode) {if (lNode == root || rNode ==root) {returnroot;
}if (root == null || lNode == null || rNode == null) {return null;
}//如果lNode是左子树的节点
if(nodeIsChild(root.leftChild, lNode)) {if(nodeIsChild(root.rightChild, rNode)) {returnroot;
}else{returnfindAllFatherNode(root.leftChild, lNode, rNode);
}
}else{if(nodeIsChild(root.leftChild, rNode)) {returnroot;
}else{returnfindAllFatherNode(root.rightChild, lNode, rNode);
}
}
}/*** getTreeFromPreAndMid: 根据前序和中序构建二叉树
*
*@parampre
* 前序序列
*@parammid
* 中序序列
*@returnTreeNode 返回类型*/
public static TreeNode getTreeFromPreAndMid(List pre, Listmid) {if (pre == null || mid == null || pre.size() == 0 || mid.size() == 0) {return null;
}if (pre.size() == 1) {return new TreeNode(pre.get(0));
}
TreeNode root = new TreeNode(pre.get(0));//找出根节点在中序中的位置
int index = 0;while (!mid.get(index++).equals(pre.get(0))) {
}//构建左子树的前序
List preLeft = new ArrayList(index);//左子树的中序
List midLeft = new ArrayList(index);for (int i = 1; i < index; i++) {
preLeft.add(pre.get(i));
}for (int i = 0; i < index - 1; i++) {
midLeft.add(mid.get(i));
}//重建左子树
root.leftChild =getTreeFromPreAndMid(preLeft, midLeft);//右子树的前序
List preRight = new ArrayList(pre.size() - index - 1);//右子树的中序
List midRight = new ArrayList(pre.size() - index - 1);for (int i = 0; i <= pre.size() - index - 1; i++) {
preRight.add(pre.get(index+i));
}for (int i = 0; i <= pre.size() - index - 1; i++) {
midRight.add(mid.get(index+i));
}//重建→子树
root.rightChild =getTreeFromPreAndMid(preRight, midRight);returnroot;
}/*** equals: 查看node1和node2两棵树是否相等(两棵树所有节点都相等)
*
*@paramnode1
* node2 两个节点
*@returnboolean 返回类型*/
public static boolean equals(TreeNode node1, TreeNodenode2) {//TODO Auto-generated method stub
if (node1 == null && node2 == null) {return true;
}else if (node1 == null || node2 == null) {return false;
}boolean isEqual =node1.value.equals(node2.value);boolean isLeftEqual =equals(node1.leftChild, node2.leftChild);boolean isRightEqual =equals(node1.rightChild, node2.rightChild);return isEqual && isLeftEqual &&isRightEqual;
}
}