所谓遍历(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)就可以了。 |