function traverseTreeNodes(treeNodes, callback) {
	  var traverse = function traverse(subTreeNodes, level, parentsChildrenPos, parentPos) {
	    if (Array.isArray(subTreeNodes)) {
	      subTreeNodes = subTreeNodes.filter(function (item) {
	        return !!item;
	      });
	    }
	    _react.Children.forEach(subTreeNodes, function (item, index) {
	      var pos = level + '-' + index;
	      parentsChildrenPos.push(pos); // Note: side effect

	      var childrenPos = [];
	      if (item.props.children && item.type && item.type.isTreeNode) {
	        traverse(item.props.children, pos, childrenPos, pos);
	      }
	      callback(item, index, pos, item.key || pos, childrenPos, parentPos);
	    });
	  };
	  traverse(treeNodes, 0, []);
	}
Note: `this._treeNodesStates`'s treeNodesStates must correspond to nodes of the
final tree (`processTreeNode` function from SelectTrigger.jsx produce the final tree).

And, `this._treeNodesStates` from `onSelect` is previous value,
so it perhaps only have a few nodes, but the newly filtered tree can have many nodes,
thus, you cannot use previous _treeNodesStates.