万分感谢!!

解决方案 »

  1.   

    用递归
    http://www.vckbase.com/document/viewdoc/?id=680
    可参考里面的那个FindItem()函数自行修改.
      

  2.   

    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;
    }
      

  3.   

    #include <stdio.h>
    #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';
    }
    }
    访问树节点的非递归方法
      

  4.   


    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 );
    }
    }
      

  5.   


    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了
    我想知道,该在哪使用判断兄弟节点来区别、到现在都没想好