public void expandTree(Node<MorrisNodeData> crtNode, int depth) {
		int expectedDep = depth;
		if (crtNode.getDepth() < expectedDep) {
			MorrisBoard crtBd = crtNode.getData().getBoard();
			List<MorrisBoard> subBd = generateAction(crtBd);

			if (subBd.size() == 0) {
				//current node is leaf, set estimation, the expanding is done
				Estimation est = calculateEstimation(crtBd);
				crtNode.getData().setEstim(est);
			}
			else {
				boolean toNextDepth = true;
				for (Iterator<MorrisBoard> iter = subBd.iterator(); iter.hasNext(); ) {
					MorrisBoard childBd = iter.next();
					MorrisNodeData childData = new MorrisNodeData();
					childData.setBoard(childBd);
					Node<MorrisNodeData> child = new Node<MorrisNodeData> (childData);
					crtNode.addChild(child);
					//check if we need expand the current level nodes, if it's set to be false by previous node, then don't need check again
					if (toNextDepth) {
						//1. this level has WIN or LOSE estimation, needn't to next depth					
						Estimation childEst = calculateEstimation(childBd);
						if (childEst.isWin() || childEst.isLose()) {
							toNextDepth = false;
						}
						//2. the depth of this level is the expected depth, don't go to next
						if (child.getDepth() == expectedDep) {
							toNextDepth = false;
						}						
					}

				}
				//added all children to current node, set estimation for children if they are leaves, otherwise continue to expand
				Node<MorrisNodeData> childNode = crtNode.getFirstChild();
				while (childNode != null) {
					if (toNextDepth) {
						expandTree(childNode, expectedDep);
					}
					else {
						Estimation est = calculateEstimation(childNode.getData().getBoard());
						childNode.getData().setEstim(est);
					}
					childNode = childNode.next();
				}
			}
		}
	}