关于二叉树遍历的一点小问题

klliers 2013-08-31 01:28:51
#include <stdio.h>
#include "BTree.h"

typedef struct _tag_Node Node;
struct _tag_Node{
BTreeNode header;
char v;
};

void printf_data(BTreeNode* node)
{
printf("%c",((Node*)node)->v);
}

BTreeNode* p = NULL;

void thread_via_left(BTreeNode* root)
{
if( root != NULL )
{
if(p != NULL)
{
p->left = root;
p = NULL;
}
if(root->left == NULL)
{
p = root;
}
thread_via_left(root->left);
thread_via_left(root->right);
}
}




int main()
{

BTree* tree = BTree_Create();

Node n1 = {{NULL,NULL},'A'};
Node n2 = {{NULL,NULL},'B'};
Node n3 = {{NULL,NULL},'C'};
Node n4 = {{NULL,NULL},'D'};
Node n5 = {{NULL,NULL},'E'};
Node n6 = {{NULL,NULL},'F'};
Node n7 = {{NULL,NULL},'G'};


BTree_Insert(tree, (BTreeNode*)&n1,0x00,0,0);
BTree_Insert(tree, (BTreeNode*)&n2,0x00,1,0);
BTree_Insert(tree, (BTreeNode*)&n3,0x01,1,0);
BTree_Insert(tree, (BTreeNode*)&n4,0x00,2,0);
// BTree_Insert(tree, (BTreeNode*)&n5,0x00,3,0);
// BTree_Insert(tree, (BTreeNode*)&n6,0x02,2,0);
// BTree_Insert(tree, (BTreeNode*)&n7,0x01,2,0);

BTreeNode* current = BTree_Root(tree);
thread_via_left(current);
while(current != NULL)
{
printf("%c",((Node*)current)->v);
current = current->left;
}




BTree_Destroy(tree);

return 0;
}
请问为什么把上面红色的部分放在它下面蓝色的那部分结构体里面就不能把这个二叉树遍历了,这个p操作的是root的地址,它不是已经将它的left指针指向下一个元素了吗,那么在Main里面还需要用到p吗?还有为什么假如要把P改为main里面的局部变量的话,为什么要把void thread_via_left(BTreeNode* root)改为void thread_via_left(BTreeNode* root,BTreeNode **p),要改为向thread_via_left传二重指针,为什么不是一生指针呢?
...全文
103 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
gongheguoyingpai11 2013-09-01
  • 打赏
  • 举报
回复
没太明白你想问什么 1楼给出的是先序遍历的递归写法 不知道你是不是想用先序遍历 如果是话用他这个方式就可以
搬砖随想录 2013-09-01
  • 打赏
  • 举报
回复

void thread_via_left(BTreeNode* root)
{
    if(NULL == root)
          exit(0);
    visit();
    thread_via_left(root->left);
    thread_via_reft(root->right);
}

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧