首页 > 技术文章 > DS博客作业03--树

you-18250630840 2020-04-12 22:27 原文

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(keydata) 递归左子树。
if(key==t->data) 删除右子树,t=t->lchild;
while (tmp->left) tmp = tmp->left,交换值,删除key。

2.1.3 运行结果

2.1.4分析该题目解题优势及难点。

寻找结点,和删除结点的方法很新,没学过。。难道是我没看懂= = !

推荐阅读