DS博客作业03--树
0.PTA得分截图
1.本周学习总结(0-5分)
1.1 总结树及串内容
BF算法,遍历整个串,直接遍历找到目标子串;
KMP算法,实在没弄懂。
二叉树:最多只有两个孩子。 完全二叉树,结点可以顺序排列。
结构:
typedef struct node
{int data;
struct node*lchild,*rchild;
}BTNode;
建法:
先序建树:
void Creat(BTree t,int n)
{ if(n>0)
{
cin>>num;
t->data=num;
Creat(t->lchild,n--);
Creat(t->rchild,n--);
}
}
顺序建树:
void Creat(BTree t,int n[],int i)
{
if(n)
{
t->data=n[i];
Creat(t->lchild,int n[],i*2);
Creat(t->rchild,int n[],i*2+1);
}
}
遍历:
先序遍历:
void pre(BTree t)
{
if(t!=NULL)
{
pre(t->lchild);
cout<<t->data;
pre(t->rchild);
}
}
中序遍历:
void pre(BTree t)
{
if(t!=NULL)
{
pre(t->lchild);
cout<<t->data;
pre(t->rchild);
}
}
后序遍历:
void pre(BTree t)
{
if(t!=NULL)
{
pre(t->lchild);
pre(t->rchild);
cout<<t->data;
}
}
树的结构:由结点,叶子,根组成。一棵树去掉根就会变成很多棵树。同理很多棵树加上同一个根也会成为一棵树。
结构: 孩子兄弟结构
typedef struct node
{
int data;
struct node*child,*brother;
}BTNode;
线索二叉树:遍历的方式,将树线索化,让结点拥有前驱和后继,除了头尾 两结点。
哈夫曼树:给定叶子权重,组成的树带权路径WPL值最小。
结构:
typedef struct node
{ int data;
int parent;
int lchild;
int rchild;
}
建树:
数组 [2*n+1]
从 parent 为-1的 数中 寻找最小两个建树,放入数组,同时修改parent 和 child 值,依次 建构。
1.2谈谈你对树的认识及学习体会。
建树的过程容易出现错误,难啊,树内容就可以结合队列,栈等一起应用。
哈夫曼树和并查集没讲,不太懂。
打代码的过程中,经常出现的问题都再建树的时候建不好,建树是最重要的一步,建错了,后面的操作都基于树,就会跟着错。
建树时我老是会忘记忘记叶子之后的空结点处理问题。导致后面操作的时候会出现错误。pta上过得去,但是vs运行会有问题。
串得KMP算法太难人了,搞不懂。脑子转不过来。
2.阅读代码(0--5分)
2.1 题目及解题代码
2.1.1 该题的设计思路
通过对比key 和结点值,进行左右子树的递归。若是找到与key相同的结点,删除结点,用左子根来取代。
然后从右子树中寻找最小值来替代结点值。同时删除key。
2.1.2 该题的伪代码
if(key>t->data) 递归右子树。
if(key
if(key==t->data) 删除右子树,t=t->lchild;
while (tmp->left) tmp = tmp->left,交换值,删除key。
2.1.3 运行结果
2.1.4分析该题目解题优势及难点。
寻找结点,和删除结点的方法很新,没学过。。难道是我没看懂= = !