首页 > 代码库 > 算法导论 10.4 有根树的表示

算法导论 10.4 有根树的表示

10.4-2 给定n个结点的二叉树,写出一个O(n)时间的递归程序,将该树种每个结点的关键字输出。

伪代码:

1 TREE-PRINT(T)2 if T != NIL3     print key[T]4     TREE-PRINT( left[T] )5     TREE-PRINT( right[T] )

c实现:

void TreePrint( Tree T ){    if ( T != NULL )    {        PrintElement( T );        TreePrint( T->left );        TreePrint( T->right );    }}

 

10.4-3

(版本一)伪代码:

1 TREE-PRINT(T, S)2   while T != NIL or S != NIL3       if T != NIL4           PUSH( S, T )5           VISIT( T )6           T = T->left7       else8           T = POP( S )9           T = T->right

(版本二)伪代码:

 1 TREE-PRINT( T, S ) 2   if T != NIL 3       PUSH( T, S ) 4       while S != NIL 5           Node = POP(S) 6           VISIT( Node ) 7           if left[Node] != NIL 8               PUSH( left[Node], S ) 9           if right[Node] != NIL10               PUSH( right[Node], S )

 

10.4-4

分析:该有根树以二叉树形式存储,可以使用上述方法处理

 

10.4-5 

分析:在结点中增加一个标志与指向父节点的指针,其为树本身的存储空间,该算法使用了固定量的额外存储空间

伪代码:

 1 TreePrint(T) 2   while T != NIL 3       while left[T] != NIL and left[T].Visited != true 4           T = left[T] 5       if  T.Visited = false 6           VISIT(T) 7           T.Visited = true 8       if right[T] != NIL and right[T].Visited != true 9           T = right[T]10       else11           T = parent[T]

 

10.4-6

解:对于有根树,采用二叉树存储形式,每个结点含有左、右指针和一个bool值;

     设置有根树中的每个结点,若其有孩子则设置其最后一个孩子的指针指向其父亲,即该结点,并设置bool为true;

     若有根树结点孩子的右指针指向兄弟结点,则设置bool值为false;

     

 

算法导论 10.4 有根树的表示