945226956 2016-08-03 06:17 采纳率: 0%
浏览 1098

c语言中数据结构二叉树的遍历问题

I use a data structrue to description a tree.
struct Node{
char *name;
int value;
//标志位,1说明该节点在数组中无效了,0则有效
int isNull;
struct Node *leftNode;
struct Node *rightNode;
struct Node *parentNode;
int isLastNode;
}.
I want to reckon a Haffman code.
this is my code:

include

include

include

struct Node{
char *name;
int value;
//标志位,1说明该节点在数组中无效了,0则有效
int isNull;
struct Node *leftNode;
struct Node *rightNode;
struct Node *parentNode;
int isLastNode;
} nodes[5],sigleNode;

//声明定义的初始化节点的方法
void initNodes();
//声明获取节点数组的长度的方法
int getNodesSize();
//声明获得哈夫曼树节点的方法
Node getHaffTree();
//声明获取值最小的节点的方法
Node getMinValueNode();
//声明获取非空节点数量的方法
int getNotNullNodesSize();
//声明判断是否是空节点的方法
int isNullNode(Node n);
//声明获取第几个有效节点的方法,i从0开始
Node getValidNode(int i);
//声明将节点插入到数组节点中无效节点的方法
void addNodetoList(Node n);
//声明检索树的方法
void viewTree(Node *n);
//主方法
int main(){
//初始化节点
initNodes();
Node mainNode = getHaffTree();
//printf("根节点值 %d \n",mainNode.value);
viewTree(&mainNode);
return 0;
}
//检索树结构
void viewTree(Node *mainNode){

    Node *leftNodeP = mainNode->leftNode;
    if( leftNodeP->isLastNode == 1){
        //计算哈夫曼码.to do
        printf("权值为[%d]的节点[%s]哈夫曼码是: \n",leftNodeP->value,leftNodeP->name);
    }else{
        viewTree(leftNodeP->leftNode);
    }

    Node *rightNodeP = mainNode->rightNode;
    if( rightNodeP->isLastNode == 1){
        //计算哈夫曼码.to do
        printf("权值为[%d]的节点[%s]哈夫曼码是: \n",rightNodeP->value,rightNodeP->name);
    }else{
        viewTree(rightNodeP->rightNode);
    }
    /*
    if(NULL != mainNode.rightNode){
        Node rightNode = *mainNode.rightNode;

        Node rlNode = *rightNode.leftNode;
        Node rrNode = *rightNode.rightNode;
        char *rlName = rlNode.name;
        char *rrName = rrNode.name;
        if(strcmp(empName,rlName) ==0 && strcmp(empName,rrName) == 0){
            printf("权值为[%d]的节点[%s]哈夫曼码是: \n",rightNode.value,rightNode.name);
        }else{
            viewTree(rightNode);
        }
    }
    */
    //viewTree(leftNode);
    /*
    if(!leftNode==NULL){
        if(leftNode.leftNode == NULL && leftNode.rightNode == NULL){
            //String haffCode = getHaffCode(leftNode,"");
            printf("权值为[%d]的节点[%s]哈夫曼码是: \n",leftNode.value,leftNode.name);
        }else{
            viewTree(leftNode);
        }
    }*/
    //Node rightNode = *mainNode.rightNode;
    //printf("右 value %d \n",rightNode.value);

    //viewTree(rightNode);
    /*
    if(!rightNode==NULL){
        if(leftNode.leftNode == NULL && leftNode.rightNode == NULL){
            //String haffCode = getHaffCode(rightNode,"");
            printf("权值为[%d]的节点[%s]哈夫曼码是:\n",rightNode.value,rightNode.name);
        }else{
            viewTree(rightNode);
        }
    }
    */

}

//递归方法组件树形数据结构
Node getHaffTree(){
int size = getNotNullNodesSize();
printf("length = %d \n",size);
if(size > 2){

    printf("before size %d \n",getNotNullNodesSize());
    Node minNode1 = getMinValueNode();
    Node minNode2 = getMinValueNode();
    printf("value1 %d \n",minNode1.value);
    printf("value2 %d \n",minNode2.value);
    printf("after size %d \n",getNotNullNodesSize());


    //声明2个节点生产的父节点对象
    Node mainNode;
    //将子节点的值相加赋给父节点
    mainNode.value = minNode1.value+minNode2.value;
    mainNode.isNull = 0;
    mainNode.isLastNode = 0;
    //将小值节点地址赋给左节点的指针变量
    mainNode.leftNode = &minNode1;
    mainNode.rightNode = &minNode2;
    minNode1.parentNode  = &mainNode;
    minNode2.parentNode = &mainNode;
    //将父节点插入到数组中的无效节点位置
    addNodetoList(mainNode);
    return getHaffTree();

}else if(size = 2){
    Node minNode1 = getMinValueNode();
    Node minNode2 = getMinValueNode();
    //声明2个节点生产的父节点对象
    Node mainNode;
    //将子节点的值相加赋给父节点
    mainNode.value = minNode1.value+minNode2.value;
    mainNode.isNull = 0;
    mainNode.isLastNode = 0;
    //将小值节点地址赋给左节点的指针变量
    mainNode.leftNode = &minNode1;
    mainNode.rightNode = &minNode2;
    minNode1.parentNode  = &mainNode;
    minNode2.parentNode = &mainNode;
    return mainNode;
}
Node n;
return n;

}

//定义声明的初始化节点方法
void initNodes(){

nodes[0].name="A";
nodes[0].value=5;
nodes[0].isNull=0;
nodes[0].isLastNode = 1;

nodes[1].name="B";
nodes[1].value=4;
nodes[1].isNull=0;
nodes[1].isLastNode = 1;

nodes[2].name="C";
nodes[2].value=3;
nodes[2].isNull=0;
nodes[2].isLastNode = 1;

nodes[3].name="D";
nodes[3].value=2;
nodes[3].isNull=0;
nodes[3].isLastNode = 1;

nodes[4].name="E";
nodes[4].value=1;
nodes[4].isNull=0;
nodes[4].isLastNode = 1;

}
//定义计算节点数量的方法
int getNodesSize(){
return sizeof(nodes)/sizeof(sigleNode);
}
int getNotNullNodesSize(){
int size = getNodesSize();
int reallSize=0;
for(int i = 0;i<size;i++){
if(isNullNode(nodes[i]) ==0){
reallSize++;
}
}
return reallSize;
}
//判断是否是空节点
int isNullNode(Node n){
if(n.isNull == 1){
return 1;
}else{
return 0;
}
}
//定义获取值最小的节点方法
Node getMinValueNode(){
int size = getNodesSize();
Node minNode = getValidNode(0);
int index = 0;
for(int i=0;i<size;i++){
Node n = nodes[i];
//空值节点不判断
if(isNullNode(n)==0 && n.value <= minNode.value){
minNode = n;
index = i;
}
}
Node empNode;
empNode.isNull = 1;
nodes[index] = empNode;
return minNode;
}
//定义获取第几个有效节点的方法
Node getValidNode(int index){
int size = getNodesSize();
int continueNum = index;
Node rs;
for(int i=0;i<size;i++){
Node n = nodes[i];
//空值节点不判断
if(isNullNode(n)==0 && continueNum ==0){
rs = n;
break;
}
if(isNullNode(n) == 0){
continueNum--;
}
}
return rs;
}
//定义将节点插入到数组节点中无效节点的方法
void addNodetoList(Node insertN){
int size = getNodesSize();
for(int i=0;i<size;i++){
Node n = nodes[i];
//如果是空白节点则,更新该位置为要插入的节点
if(isNullNode(n)==1){
nodes[i] = insertN;
break;
}
}
}

I debug for the main method, before into the viewTree(Node *N) method,the mainNode like pic1:
进入遍历树节点方法前的mainNode
but when I debug into the viewTree(Node *n) method.
thie mainNode like pic2?!
进入遍历树节点方法时候的mainNode

who can help me to explain such problem?
Thanks !

  • 写回答

2条回答 默认 最新

  • 鱼弦 全栈领域优质创作者 2016-08-03 06:26
    关注

    二叉树 遍历可参考:
    #include //头文件
    #include
    typedef struct BiTNode
    {
    char data;
    struct BiTNode *lchild,*rchild;
    }
    BiTNode,*BiTree;//定义结点类型
    BiTree CreateBiTree()//创建树
    {
    char p;BiTree T;
    scanf("%c",&p);
    if(p==' ')
    T=NULL;
    else
    {
    T=(BiTNode *)malloc(sizeof(BiTNode));//为结点开辟空间
    T->data=p;
    T->lchild=CreateBiTree();
    T->rchild=CreateBiTree();
    }
    return (T);
    }
    void PreOrder(BiTree T)//先序
    {
    if(T!=NULL)
    {
    printf("%c",T->data);
    PreOrder(T->lchild);
    PreOrder(T->rchild);

    }
    

    }
    void InOrder(BiTree T)//中序
    {
    if(T!=NULL)
    {
    InOrder(T->lchild);
    printf("%c",T->data);
    InOrder(T->rchild);

    }
    

    }
    void PostOrder(BiTree T)//后序
    {
    if(T!=NULL)
    {
    PostOrder(T->lchild);
    PostOrder(T->rchild);
    printf("%c",T->data);
    }
    }
    void main()//主函数
    {
    BiTree Ta;
    Ta=CreateBiTree();
    printf("先序遍历:");
    printf("\n");
    PreOrder(Ta);
    printf("\n");
    printf("中序遍历:");
    printf("\n");
    InOrder(Ta);
    printf("\n");
    printf("后序遍历:");
    printf("\n");
    PostOrder(Ta);
    }

    
    
    评论

报告相同问题?

悬赏问题

  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 保护模式-系统加载-段寄存器