java的树_java实现树的一般操作

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;

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值