求一个遍历树节点的算法 万分感谢!! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 用递归http://www.vckbase.com/document/viewdoc/?id=680可参考里面的那个FindItem()函数自行修改. struct Tree{ unsigned int childcount; Tree **tree; Tree* pchild(int i) { if(childcount>i) return tree[i]; return NULL; } //ADD member}doFine(Tree *tree){for(int i=0;i<tree->childcount;i++){ doFine(tree.pchild(i));} //return;} #include <stdio.h>#include <stdlib.h>#include "string.h"#include "malloc.h"int p1,p2;#define MAXSIZE 30typedef struct { char letter; char *code; int weight; int parent; int rchild; int lchild; int flag;}HufmTree;void CreateTree(HufmTree tree[MAXSIZE],int n);void Select (HufmTree tree[MAXSIZE],int n);void Display(HufmTree tree[MAXSIZE],int n);void TreeCode(HufmTree tree[MAXSIZE],int n);void main(){ HufmTree mytree[MAXSIZE]; int inputnumber; printf("请输入叶子节点的个数:"); scanf("%d",&inputnumber); CreateTree(mytree,inputnumber); TreeCode( mytree, inputnumber); Display(mytree,inputnumber);}void CreateTree(HufmTree tree[],int n){ int i,m,num; char c; m=2*n-1; for(i=1;i<=m;i++) { tree[i].letter='0'; tree[i].code="0"; tree[i].weight=0; tree[i].parent=0; tree[i].rchild=0; tree[i].lchild=0; tree[i].flag=0; } printf("请输入各个节点的权值:"); for(i=1;i<=n;i++) { printf("请输入第%d 节点的权值和字符",i); scanf("%d%c",&num,&c); tree[i].weight=num; tree[i].letter=c; printf("%d%c",tree[i].weight,tree[i].letter); } for(i=n+1;i<=m;i++) { Select(tree ,i-1); tree[p1].parent=i; tree[p2].parent=i; if(tree[p1].weight>tree[p2].weight) { tree[i].lchild=p2; tree[i].rchild=p1; } else { tree[i].lchild=p1; tree[i].rchild=p2; } tree[i].weight=tree[p1].weight+tree[p2].weight; int j=tree[i].weight; // printf("%d观察",j); }}void Select (HufmTree tree[],int n){ int minvalue1=1000; int minvalue2=1000; if(n<=1) return;//for(int i=1;tree[i].flag==1;i++); //p1=i; //minvalue1=tree[i].weight; for(int j=1;j<=n;j++) { if((tree[j].flag==0)&&(minvalue1>tree[j].weight)) {p1=j; minvalue1=tree[j].weight; } } tree[p1].flag=1;//for( i=1;tree[i].flag==1;i++); //p2=i; //minvalue2=tree[i].weight; for( j=1;j<=n;j++) { if((tree[j].flag==0)&&(minvalue2>tree[j].weight)) {p2=j; minvalue2=tree[j].weight; } } tree[p2].flag=1;}void Display(HufmTree tree[],int n){ int m=2*n-1; for(int i=1;i<=m;i++) { printf("HufmTree[%2d].parent=%3d\n",i,tree[i].parent); printf("HufmTree[%2d].weight=%3d\n",i,tree[i].weight); printf("HufmTree[%2d].lchild=%3d\n",i,tree[i].lchild); printf("HufmTree[%2d].rchild=%3d\n",i,tree[i].rchild); printf("HufmTree[%2d].flag=%3d\n",i,tree[i].flag); }}void TreeCode(HufmTree tree[],int n){ int s=n-1; char *temp=(char*)malloc(sizeof(char)*n); temp[s]='\0'; for(int i=1;i<=n;i++) { int p=i; while(tree[p].parent!=0) { int d=p; p=tree[p].parent; if(tree[p].lchild==d) temp[--s]='0'; else if(tree[p].rchild==d) temp[--s]='1'; } tree[i].code=(char*)malloc(sizeof(char)*(n-s)); strcpy(tree[i].code,temp+s); printf("%s\n",tree[i].code); temp[s]='\0'; }}访问树节点的非递归方法 voidCFileSystem::SaveTree( HTREEITEM tree, FILE *fp, int deep ){ char buf[ 300 ] = ""; HTREEITEM child; HTREEITEM next; if( m_tree1.ItemHasChildren( tree ) ) { child = m_tree1.GetChildItem( tree ); do { SaveTree( child, fp, deep + 1 ); next = m_tree1.GetNextItem( child, TVGN_NEXT ); child = next; } while ( NULL != child ); }} void CMyTree::OnLButtonDown(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default UINT uFlags; HTREEITEM itemnode = HitTest(point, &uFlags); if (GetStyle() & TVS_CHECKBOXES) { if ((itemnode != NULL) && (uFlags & TVHT_ONITEMSTATEICON)) { BOOL checked = !GetCheck(itemnode); HTREEITEM childnode1, childnode2; childnode1 = GetChildItem(itemnode); while (childnode1) { childnode2 = GetChildItem(childnode1); if (childnode2) { childnode1 = childnode2; continue; } else { SetCheck(childnode1, checked); childnode2 = GetNextItem(childnode1, TVGN_NEXT); if (!childnode2) { childnode1 = GetParentItem(childnode1); if (childnode1 != itemnode) SetCheck(childnode1, checked); childnode1 = GetNextItem(childnode1, TVGN_NEXT); } else childnode1 = childnode2; } } } }}我这样遍历的,是对的。但在前面加复选框后,只要check了有子节点的,下面的节点也就全部check了我想知道,该在哪使用判断兄弟节点来区别、到现在都没想好 Cstring问题 上位机与USB设备端点通信的问题? 讨论getrows movenext COM dll里如何写重载函数或者有默认参数的函数? 远程文件读取 关于OLE32.DLL的一个问题,难道从来没有人碰到过吗? 为什么编译的可执行文件在其他计算机无法运行? 关于Label的一个小问题 高份征集, 哪位老兄有 类似 微软 画图板的源代码, 烦请发给我一份。可以再加一百分 求科普,免驱动是咋实现的? 继承CRectTracker类出错 有关变量类型的问题,在线等
http://www.vckbase.com/document/viewdoc/?id=680
可参考里面的那个FindItem()函数自行修改.
{
unsigned int childcount;
Tree **tree; Tree* pchild(int i)
{
if(childcount>i)
return tree[i];
return NULL;
}
//ADD member
}doFine(Tree *tree)
{
for(int i=0;i<tree->childcount;i++)
{
doFine(tree.pchild(i));
}
//
return;
}
#include <stdlib.h>
#include "string.h"
#include "malloc.h"
int p1,p2;
#define MAXSIZE 30
typedef struct {
char letter;
char *code;
int weight;
int parent;
int rchild;
int lchild;
int flag;
}HufmTree;
void CreateTree(HufmTree tree[MAXSIZE],int n);
void Select (HufmTree tree[MAXSIZE],int n);
void Display(HufmTree tree[MAXSIZE],int n);
void TreeCode(HufmTree tree[MAXSIZE],int n);
void main()
{
HufmTree mytree[MAXSIZE];
int inputnumber;
printf("请输入叶子节点的个数:");
scanf("%d",&inputnumber);
CreateTree(mytree,inputnumber);
TreeCode( mytree, inputnumber);
Display(mytree,inputnumber);
}void CreateTree(HufmTree tree[],int n)
{
int i,m,num;
char c;
m=2*n-1;
for(i=1;i<=m;i++)
{
tree[i].letter='0'; tree[i].code="0";
tree[i].weight=0;
tree[i].parent=0;
tree[i].rchild=0;
tree[i].lchild=0;
tree[i].flag=0;
}
printf("请输入各个节点的权值:");
for(i=1;i<=n;i++)
{ printf("请输入第%d 节点的权值和字符",i);
scanf("%d%c",&num,&c);
tree[i].weight=num;
tree[i].letter=c;
printf("%d%c",tree[i].weight,tree[i].letter); }
for(i=n+1;i<=m;i++)
{
Select(tree ,i-1); tree[p1].parent=i;
tree[p2].parent=i;
if(tree[p1].weight>tree[p2].weight)
{
tree[i].lchild=p2;
tree[i].rchild=p1;
}
else { tree[i].lchild=p1;
tree[i].rchild=p2;
}
tree[i].weight=tree[p1].weight+tree[p2].weight;
int j=tree[i].weight;
//
printf("%d观察",j); }
}void Select (HufmTree tree[],int n)
{
int minvalue1=1000;
int minvalue2=1000;
if(n<=1)
return;//for(int i=1;tree[i].flag==1;i++);
//p1=i;
//minvalue1=tree[i].weight;
for(int j=1;j<=n;j++)
{
if((tree[j].flag==0)&&(minvalue1>tree[j].weight))
{p1=j;
minvalue1=tree[j].weight;
} }
tree[p1].flag=1;
//for( i=1;tree[i].flag==1;i++);
//p2=i;
//minvalue2=tree[i].weight;
for(
j=1;j<=n;j++)
{
if((tree[j].flag==0)&&(minvalue2>tree[j].weight))
{p2=j;
minvalue2=tree[j].weight;
} } tree[p2].flag=1;
}
void Display(HufmTree tree[],int n)
{
int m=2*n-1;
for(int i=1;i<=m;i++)
{
printf("HufmTree[%2d].parent=%3d\n",i,tree[i].parent);
printf("HufmTree[%2d].weight=%3d\n",i,tree[i].weight);
printf("HufmTree[%2d].lchild=%3d\n",i,tree[i].lchild);
printf("HufmTree[%2d].rchild=%3d\n",i,tree[i].rchild);
printf("HufmTree[%2d].flag=%3d\n",i,tree[i].flag);
}
}
void TreeCode(HufmTree tree[],int n)
{
int s=n-1;
char *temp=(char*)malloc(sizeof(char)*n);
temp[s]='\0';
for(int i=1;i<=n;i++)
{
int p=i;
while(tree[p].parent!=0)
{ int d=p;
p=tree[p].parent;
if(tree[p].lchild==d)
temp[--s]='0';
else if(tree[p].rchild==d)
temp[--s]='1';
}
tree[i].code=(char*)malloc(sizeof(char)*(n-s));
strcpy(tree[i].code,temp+s);
printf("%s\n",tree[i].code);
temp[s]='\0';
}
}
访问树节点的非递归方法
void
CFileSystem::SaveTree( HTREEITEM tree, FILE *fp, int deep )
{
char buf[ 300 ] = ""; HTREEITEM child;
HTREEITEM next;
if( m_tree1.ItemHasChildren( tree ) )
{
child = m_tree1.GetChildItem( tree );
do
{
SaveTree( child, fp, deep + 1 );
next = m_tree1.GetNextItem( child, TVGN_NEXT );
child = next;
} while ( NULL != child );
}
}
void CMyTree::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
UINT uFlags;
HTREEITEM itemnode = HitTest(point, &uFlags);
if (GetStyle() & TVS_CHECKBOXES)
{
if ((itemnode != NULL) && (uFlags & TVHT_ONITEMSTATEICON))
{
BOOL checked = !GetCheck(itemnode);
HTREEITEM childnode1, childnode2;
childnode1 = GetChildItem(itemnode);
while (childnode1)
{
childnode2 = GetChildItem(childnode1);
if (childnode2)
{
childnode1 = childnode2;
continue;
}
else
{
SetCheck(childnode1, checked);
childnode2 = GetNextItem(childnode1, TVGN_NEXT);
if (!childnode2)
{
childnode1 = GetParentItem(childnode1);
if (childnode1 != itemnode)
SetCheck(childnode1, checked);
childnode1 = GetNextItem(childnode1, TVGN_NEXT);
}
else
childnode1 = childnode2;
}
}
}
}
}我这样遍历的,是对的。
但在前面加复选框后,只要check了有子节点的,下面的节点也就全部check了
我想知道,该在哪使用判断兄弟节点来区别、到现在都没想好