First we try, then we trust

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

十三、 TreeLinkedList的设计

在《华容道与数据结构 (2) 》中,设计了用于广度优先的树型链表。如下图:

 

链表是通过图中蓝颜色箭头链接起来的,而黑颜色箭头构成了树型结构。整个结构用来存储搜索结果,每一搜索步骤是一个层级,逐层深入直到找到结果。从图中可以看出,每个节点有两个指针,分别指向下一个节点与父节点。因此,在TreeLinkedList中定义节点类如下:

protected class TreeNode
{
  
public ChessStep chessStep;
  
public TreeNode parentNode;
  
public TreeNode link;
}

chessStep是该节点的"负载",parentNode指向父节点,而link指向下一节点。在TreeLinkedList中有三个指针:

protected TreeNode root = null;
protected TreeNode current = null;
protected TreeNode end = null;

分别指向根节点,"当前"节点(所谓当前节点是指:所有新加入的节点的父节点都被设置为current指针指向的节点),链表尾节点。TreeLinkedList被初始化时,各指针均被清空,并将计数器清零。

public void ClearAll()
{
  root 
= null;
  current 
= null;
  end 
= null;
  count 
= 0;
}

向树中插入节点的代码如下:

public void insertNode(ChessStep newitem)
{
  TreeNode newNode;
    
  newNode 
= new TreeNode();
  newNode.chessStep 
= newitem;
  newNode.link 
= null;
  newNode.parentNode 
= null;

  
if(root == null)
  
{   
    root 
= newNode;
    current 
= newNode;
    end 
= current;
  }

  
else
  
{
    newNode.parentNode 
= current;
    end.link 
= newNode;
    end 
= newNode;
    end.link 
= newNode;
    end 
= newNode;
  }

  count
++;
}

可以看出,代码中新节点为newNode,如果根节点为空,则仅仅将root、current、end指针指向新节点。如果根节点不为空,那么将newNode节点的父节点指向current指针所指的节点,将end节点的下一个节点设置为newNode,然后将end指针指向newNode。于是新节点便被添加进来。除此之外,我们还需要一个方法,在合适的时候移动current指针:

public void MoveCurrentToNext()
{
  
if(current != null && current.link != null)
    current 
= current.link;
}

现在,有了这些方法我们就可以构件TreeLinkedList结构了。如图:

 

要想构建上图所示树型结构,我们可以通过以下命令来实现:

ChessStep s1, s2, s3, s4, s5, s6, s7, s8;

TreeLinkedList t 
= new TreeLinkedList();
t.insertNode(s1);
t.insertNode(s2);
t.insertNode(s3);
t.MoveCurrentToNext();
t.insertNode(s4);
t.insertNode(s5);
t.MoveCurrentToNext();
t.insertNode(s6);
t.insertNode(s7);
t.insertNode(s8);

TreeLinkedList类中还有一个TraceResult,是用来通过堆栈结构追踪棋步的。比较简单,在这里就不再介绍了。

(下部分内容将介绍CircularLinkedList类。它是整个程序的核心。)

posted on 2005-02-07 20:14  吕震宇  阅读(2953)  评论(4编辑  收藏  举报