This answer was converted to its own TikZ library ext.node-families as part of my tikz-extensions package.
I think, this is nearly as automatic as it gets. It uses the .aux file and won't work when the picture is externalized with the external library.
You specify a family of nodes that shall have the same dimension with the following keys that are all in the name space /tikz/node family:
Type: Text box.
Before a node is constructed the dimension of the text box that contains the node's text (\pgfnodeparttextbox) is measured and compared. The biggest value is used.
text height=<name>: Nodes with the same <name> will have the same text height.
text depth=<name>: Nodes with the same <name> will have the same text depth.
text width=<name>: Nodes with the same <name> will have the same text width.
text width align = left|center|right:
Setting the width of the text box only extends the box to the right. The content of th box needs to be re-aligned. The text width align key (default center) makes sure that is done correctly.
text=<name> sets all text height, text depth and text width to the same <name>.
By default, this is only set up for the base shapes rectangle and circle. After another shape is declared (usually by loading one of the shapes.* libraries) it can be setup in the same way by using
\tikzset{node family/setup shape=<shape name>}
This should be done only once per shape.
Since this only changes the dimensions of the text box, for different shapes in the same family this might lead to different widths or height of the shape since their dimensions are calculated different based on the size of the text box. Consider this example:
\tikz[nodes=draw, node family/text width=test] \node {Foo} node[circle] {Barbarbar};
which leads to the following output:

Type: Minimum height and minimum width.
Contrary to the text box measurements, this uses the height and width of the shape that is calculated by the shape's declaration itself. As this calculation is done somewhere deep inside the shape's declaration new shape declarations are necessary: Circle and Rectangle.
As with /pgf/minimum width and /pgf/minimum height, this ignores any values of /pgf/outer xsep and /pgf/outer ysep or the line width itself.
Setting <name> to an empty value will disable the actions of this library.
Internally, the writing to the .aux file happens at the end of the picture which uses \tikz@atend@picture (execute at end picture).
The key prefix specifies the prefix for all node families. By default this is \pgfpictureid-, this makes it so that node families only apply to TikZpictures indidvidually.
In the example below, all familes are named test but they are all different ones.
I have also used the positioning library which makes the effect more noticeable.
The code still may be optimized a bit as for the example below seven additional macros are defined by the .aux file. It might be better to save all values from one family in one macro?
Code
\documentclass[12pt,tikz]{standalone} \usetikzlibrary{ positioning, % better positioning (right=of …) ext.node-families, % node families arrows.meta % arrow tips } \begin{document} \begin{tikzpicture}[ node distance=.3cm and 1cm, box/.style={ rectangle, draw, minimum width=+8ex, minimum height=+4ex, inner sep=+0pt, node family/text width=test}, split/.style={ circle, draw, minimum size=+2.5pt, fill=black, inner sep=+0pt}] \node[split] (split) {}; \node[box, right=of split] (I) {Short}; \node[box, above=of I] (P) {This node has long node text}; \node[box, below=of I] (D) {Short}; \draw[-Stealth] (split.north) |-(P); \draw[-Stealth] (split.east) -- (I) ; \draw[-Stealth] (split.south) |-(D); \end{tikzpicture} \tikz % only the same height (text is still centered) \foreach \cnt[count=\Cnt] in {a,...,h} \node[draw, Circle, node family/height=test] at (right:\Cnt) {\cnt}; \tikz % height and text height (text depth set to zero) \foreach \cnt[count=\Cnt] in {a,...,h} \node[draw, Circle, text depth=+0pt, node family={height=test, text height=test}] at (right:\Cnt) {\cnt}; \begin{tikzpicture}[% http://tex.stackexchange.com/q/134983 nodes={circle, draw=black, node family/text=test}] \node (A) {$n$}; \node[right=0pt of A] (B) {$n+1$}; \end{tikzpicture} \end{document}
Output
First compilation

Second compilation

Output (Examples)

minimum widthdeclaration. Otherwise you have to read all nodes and then redraw which against automation idea.fitlibrary fromtikz, I've answered about here some time ago. Maybe this helps.