Be MySelf                                                    
 

 

日志更新

最新评论

留言板

链接

Blog信息





复习树的遍历
haosheng 发表于 2006/8/20 10:41:00


     所谓遍历(Traversal)是指沿着某条搜索路线,依次对树中每个结点均做一次且仅做一次访问。访问结点所做的操作依赖于具体的应用问题。

     树的特型二叉树(BinaryTree)是n(n≥0)个结点的有限集,它或者是空集(n=0),或者由一个根结点及两棵互不相交的、分别称作这个根的左子树右子树的二叉树组成。

 

由于二叉树是一种非线性结构,每个结点可能有一个以上的直接后继,因此,必须规定遍历的规则,并按此规则遍历二叉树,最后得到二叉树所有结点的一个线性序列。 令L,R,D分别代表二叉树的左子树、右子树、根结点,则遍历二叉树有6种规则:DLR、DRL、LDR、LRD、RDL、RKD。若规定二叉树中必须先左后右(左右顺序不能颠倒),则只有DLR、LDR、LRD三种遍历规则。DLR称为前根遍历(或前序遍历、先序遍历、先根遍历),LDR称为中根遍历(或中序遍历),LRD称为后根遍历(或后序遍历)。

 

树或森林与二叉树之间有一个自然的一一对应关系。任何一个森林或一棵树可惟一地对应到一棵二叉树;反之,任何一棵二叉树也能惟一地对应到一个森林或一棵树。

 

树的遍历

     设树T如下图所示,结点R是根,根的子树从左到右依次为T1,T2,…,Tk
      
1.树T的前序遍历定义: 
  若树T非空,则:
 ①访问根结点R;
  ②依次前序遍历根R的各子树T1,T2,…,Tk

2.树的后序遍历定义:
  若树T非空,则:
    ①依次后序遍历根T的各子树Tl,T2,…,Tk
    ②访问根结点R。


例,想扩展Treeview的所有接点

void CInstallTreeView::ExpandTree(HTREEITEM hItem)
{
 CTreeCtrl & cTree = this->GetTreeCtrl();
 if(hItem && cTree)
 {
  HTREEITEM hSibleItem = NULL;
  HTREEITEM hClildItem = NULL;

  cTree.Expand(hItem,TVE_EXPAND );
  hClildItem = cTree.GetChildItem(hItem);
     while(hClildItem != NULL)
  {
   ExpandTree(hClildItem);
   hClildItem = cTree.GetNextSiblingItem(hClildItem);
  }

 }
}

然后调用ExpandTree(TVI_ROOT)就可以了。


阅读全文 | 回复(0) | 引用通告 | 编辑 | 收藏该日志
 


发表评论:

    昵称:
    密码:
    主页:
    标题: