数据结构代码题Day04
题目01(对应视频Day43)
查找二叉树中data域等于key的结点是否存在,若存在,将q指向它,否则q为空
题目分析
由于题目要求对二叉树中的key的数值进行查找,因此最终正确的输出结果便是:
- 遍历二叉树
- 找到data==key
- 赋值q=p
- 否则输出为NULL
其思维流程图如下:
结合上述的思维流程图,下面开始编写解题代码:
- 第一步-----> 遍历二叉树
模板代码
这里选择先序遍历对其进行模板基础,下面给出先序遍历的递归实现模板:
//二叉树递归先序遍历
void PreOrder(BiTree * root){
if(root == NULL){
return ;
}
if(root != NULL){
visit(root->data);
PreOrder(root->lchild);
PreOrder(root->rchild);
}
}
- 第二步----> 对模板进行改进
给出改进代码: - 1、首先要先给出一个q结点参数
- 2、对visit函数进行改进,设置判断逻辑
-3、 对递归函数进行改进。
解题代码
解题代码如下:
//二叉树递归先序遍历
//1、参数改造
void PreOrder(BiTree * root,BiTree * q,int key){
if(root == NULL){
return ;
}
if(root != NULL){
//visit(root->data);
//2、visit进行改进
if(root->data == key){
q = root;
}else{
//3、对其进行递归函数改进
PreOrder(root->lchild,q,key);
PreOrder(root->rchild,q,key);
}
}
}
题目02–对应视频Day44
利用结点的右孩子指针将一个二叉树的叶子结点从左向右链接成一个单链表(head指向第一个,tail指向最后一个)
题目要求分析
- 利用结点的右孩子将叶子结点链接成单链表,因此右孩子这里代表着操作指针,即尾插法链接的操作方式,由于这里规定了tail指针指向最后一个结点,因此我们以tail指针作为尾插法进行建立链表的操作指针
- 对于根据题目得到的例图如下:
结合上述的图片,下面对其进行代码编写思路的分析:
- 题目要求对叶子结点进行连接成单链表;
- 首先是要找到叶子结点
如何找到叶子节点
相信第一步,都可以很好的编写出来模板代码:
void GetSimpleNode(BiTree * root,BiTree * head,BiTree * tail){
if(root == NULL){
return ;
}
if(root != NULL){
if(root->lchild == NULL && root->rchild == NULL){
//找到了叶子节点
}
GetSimpleNode(root->lchild,head,tail);
GetSimpleNode(root->rchild,head,tail);
}
}
- 第一步思路代码给出后,下面是第二步是构建单链表
- 构建单链表的思路是:
一、初始化时head和tail指向第一个结点
二、后续的查找到叶子结点后采用尾插的方式链接到第一个结点后面
下面是对构建单链表的两个步骤进行分析
如何区分第一个结点和其他结点?
结合head指针指向第一个结点,因此对于第一个查找到的叶子结点和后续的叶子结点进行区分如下。
- 若当前是第一个叶子结点,那么head指向该节点;
- 这时head指针得到了赋值;
- 若当前是后续查找到的叶子结点,那么由于head指针已经被赋值,因此这时的head指针的数值是非NULL的,只能通过tail指针进行尾插;
- 结合上述的分析,这里我们以head是否为NULL为第一个叶子结点和其他叶子节点的区别。
基于以上的分析,对其进行核心的构建单链表的代码进行编写:
if(head == NULL){
//当前是查找到第一个叶子结点
head = root;
tail = root;//同时赋值
}else{
//当前不是第一个叶子结点
tail->rchild = p;//由于tail的rchild作为链接操作指针,因此这里使用rchild作为操作指针
tail = p;//进行尾插操作
}
结合上述的两个大步骤,对其进行合并,便是最后的操作代码
void GetSimpleNode(BiTree * root,BiTree * head,BiTree * tail){
if(root == NULL){
return ;
}
if(root != NULL){
if(root->lchild == NULL && root->rchild == NULL){
//找到了叶子节点
if(head == NULL){
//当前是查找到第一个叶子结点
head = root;
tail = root;//同时赋值
}else{
//当前不是第一个叶子结点
tail->rchild = p;//由于tail的rchild作为链接操作指针,因此这里使用rchild作为操作指针
tail = p;//进行尾插操作
}
}
GetSimpleNode(root->lchild,head,tail);
GetSimpleNode(root->rchild,head,tail);
}
}