为了督促自己,这是第一篇正式的数据结构《学习报告》。
(一)结构定义
这次学的是二叉树结构。首先还是结构的定义:
typedef struct Node{
int key;
struct Node *lchild, * rchild;
}
(二)结构操作
节点建立操作:
Node *get(int key){
Node *p -> (Node *)malloc*sizeof(Node));
p -> key = key;
p-> lchild = p->child =NULL;
return p;
}
销毁操作
void clear(Node * root){
if(root == NULL) return ;
clear(root->lchild);
clear(root->rchild);
}
销毁操作运用了一个递归方法,一层一层销毁,保证彻底销毁。然后这里涉及到一个我自己最开始很不理解问题,就是void无返回值函数为什么会有return,其实这可能是我自己思维定势问题,其实void函数是可以用来终止函数的,但是自我感觉还是没有很大的影响。
插入操作
这里就不写代码了,讲讲思路就好。
①自定义函数读入要插入的目标树及其插入值
②如果树为空,即返回一个新节点(就是为该插入值创立一个新节点,运用树的定义即可)
③选择插入的是左树还是右树,这里还是可以继续套用一个简单递归的。
广度优先遍历
广度优先遍历也称层序遍历,就是把每一层进行遍历,遍历完一层才会再遍历下一层
void bfs(Node *root){
head =tail =0;
queue[tail++]=root;
while(head < tail ){
Node *node = queue[head];
printf(“\nnode:%d\n”,node->key);
if(node->lchild != NULL){
queue[tail++] = node ->lchild;
//printf(“\t%d->%d(left)\n”,node->key,node->lchild);
}
if(node->rchild != NULL){
queue[tail++] = node ->rchild;
//printf(“\t%d->%d(right)\n”,node->key,node->rchild);
}
head++;
}
return ;
}
深度优先遍历
输出的一个时间区间,个人理解其实就是数组下标区间
①定义一个变量,用来存放数组下标;
②输出区间
int tot=0;
void dfs(Node *root){
if(root == NULL) return;
int start,end;
tot++;
start = tot;
//不断对子节点进行递归
if(root->lchild) dfa(root->lchild);//当前节点有左子树
if(root->rchild) dfa(root->rchild);//当前节点有右子树
tot++;
end = tot;
printf(“%d:[%d,%d]\n”,root->key,start,end);
return ;
}
可以用用这个图来辅助理解一下广度优先遍历和深度优先遍历
参考文章:void函数使用return http://t.csdnimg.cn/gaPIr
下集预告:力扣题库102题。