14.[题目分析]由孩子兄弟链表表示的树,求高度的
递归模型是:若树为空,高度为零;若第一子女为空,高度为1和兄弟
子树的高度的大者;否则,高度为第一子女树高度加1和兄弟子树高度的大者。其非递归算法使用队列,逐层遍历树,取得树的高度。int Height(CSTree bt) //递归求以孩子兄弟链表表示的树的深度{int hc,hsif (bt==null) return (0)elseif (!bt->firstchild) return (1+height(bt->nextsibling)//子女空,查兄弟的深度else //
结点既有第一子女又有兄弟,高度取子女高度+1和兄弟子树高度的大者{hc=height(bt->firstchild); //第一子女树高hs=height(bt->nextsibling);//兄弟树if(hc+1>hs)return(hc+1)elsereturn (hs)}}//结束heightint height(CSTree t) //非递归遍历求以孩子兄弟链表表示的树的深度{if(t==null) return(0)else{int front=1,rear=1//front,rear是队头队尾元素的指针int last=1,h=0//last指向树中同层结点中最后一个结点,h是树的高度Q[rear]=t//Q是以树中结点为元素的队while(front<=last){t=Q[front++]//队头出列while(t!=null) //层次遍历{if (t->firstchild) Q[++rear]=t->firstchild//第一子女入队t=t->nextsibling//同层兄弟指针后移}if(front>last) //本层结束,深度加1(初始深度为0)h++last=rear} //last再移到指向当前层最右一个结}//while(front<=last)}//else }//Heighttemplate<class elemtype>//二叉树结点
struct nodetype
{
elemtype info//结点信息
nodetype<elemtype>*llink//左子树
nodetype<elemtype>*rlink//右子树
}
template<class elemtype>
void inorder(nodetype<elemtype>*p)//中序遍历
{
if(NULL!=p)
{inorder(p->llink)//使用递归算法先遍历左子树
cout<<p->info<<" "//访问结点
inorder(p->rlink)//遍历右子树
}
}
我也正在学数据结构,也不太会,编了个中序遍历的小程序,仅供参考
评论列表(0条)