求算法:求树中节点数解决方法

求算法:求树中节点数
每个节点给出了父节点及孩子结点列表

Java code
int parentID;
ArrayList<Integer> chilList;



如何求以任意节点为根节点是树中的节点数? 

[color=#3366FF]要求不用递归不用栈。[/color]

------解决方案--------------------
http://topic.csdn.net/u/20080320/20/c8e2b970-4cc9-4205-9701-e55c97d0d7e7.html
【请教】*外企的一道面试题:遍历二叉树,要求空间复杂度是个常量,跟树的高度规模等没有关系 

实际上一样的题目;
------解决方案--------------------
/*非递归无栈二叉树中序遍历算法*/
void InOrder2(BiTree T) { 
BiTree top=NULL,lr=NULL,r,av,
p=T,q=T;
/*top为栈顶指针,lr记录当前2子树结点,r为临时变量,
av为当前可用叶子结点,p为当前访问结点,q为p的父亲结点*/
if(T==NULL) return ;
while(1) { /*向下访问搜索*/
while(1) { 
if(p->lchild==NULL&&p->rchild==NULL) {/*如果访问到底,就输出该结点*/
printf("%c ",p->data);
break;
}
else if(p->lchild==NULL) {/*沿左子树访问到底,转向访问右子树*/
printf("%c ",p->data);
r=p->rchild; 
p->rchild=q;
q=p; p=r;
}
else {/*一直沿左子树访问下去*/
r=p->lchild; 
p->lchild=q;
q=p; p=r;
}
}
av=p;/*p为叶子结点,av记录当前叶子结点*/
while(1) {
if(p==T) return;/*如果回退到根,返回*/
else if(q->lchild==NULL) {/*如果父结点q的lchild为空,
表示p为q的右儿子*/
r=q->rchild; /*向父结点的右儿子方向回退*/
q->rchild=p; /*重新连接父指针*/
p=q; q=r;
}
else if(q->rchild==NULL) {/*类似上面*/
r=q->lchild;
q->lchild=p;
p=q; q=r;
printf("%c ",p->data);
}
else {/*如果p的父亲q有两个子树,用以下方法判断p是q的左儿子还是右儿子*/
if(q==lr) {/*p是q的右儿子*/
r=top; /*退栈*/
lr=r->lchild; /*lchild相当于链表的data域,rchild相当next域*/ 
top=r->rchild;
r->lchild=r->rchild=NULL;/*退栈结束*/
r=q->rchild; 
q->rchild=p;
p=q; q=r;
}
else { /*p是q的左儿子*/
printf("%c ",q->data);
av->lchild=lr;/*入栈加回退操作*/
av->rchild=top;
top=av; lr=q;
r=q->lchild;
q->lchild=p;
p=q->rchild;
q->rchild=r;
break;
}
}
}
}

}


1楼的链接不错,共同学习学习!