博客作业04--树

1.学习总结

1.1树结构思维导图

1.2 树结构学习体会

学习树这一章节大量地用到了递归算法,虽然是几行代码就解决的事情,但是在写之前要考虑清楚递归结束的标志是什么,每一步的递归需要做什么,这些都是需要认真仔细思考的。当熟悉之后树似乎也不是那么难,但是对于处理表达式树、线索树、哈夫曼树、并查集还存在困难。二叉树的主要应用在平衡二叉树,可以使查找、插入、删除的时间复杂度最坏为O(log n),大大提高了算法效率,还有哈夫曼树在编码一块的应用。

2.PTA实验作业

2.1.1 题目1:表达式树【未完成】

2.1.2 设计思路

2.1.3 代码截图

2.1.4 PTA提交列表说明。

2.2.1 题目2:还原二叉树

2.2.2 设计思路

1.还原二叉树函数

if n<=0 return NULL;
新建二叉树节点b,令b->data指向根节点
for p=in to in+n
    if p等于根节点,停止循环
k=p-in; //k为根节点在in中的位置
递归造左子树
递归造右子树

2.求树的高度函数

if 树为空 返回NULL
else
    左子树高度=递归左子树
    右子树高度=递归右子树
    比较左右子树的高度,返回(更大的高度+1)

2.2.3 代码截图

2.2.4 PTA提交列表说明。

还原二叉树的代码是课本上的,但是在调试的时候不知道为什么发生段错误,后来发现是对于字符数组的定义有点问题。

2.3.1 题目3:二叉树叶子结点带权路径长度和

2.3.2 设计思路

  • 计算叶子带权路径之和
定义全局变量WPL表示带权路径之和,length表示当前叶节点的路径长度
if b不为空
    if b的左右子树同时为空
        计算叶子节点b的带权路径长度,重置length为0
    length++
    递归左子树
    递归右子树

2.3.3 代码截图

2.3.4 PTA提交列表说明。

经过调试发现右子树下的左右子树,在计算时第三个叶节点的路径不是从根节点开始计算,目前还没想到如何解决。

3.截图本周题目集的PTA最后排名

3.1 PTA排名

3.2 我的得分:145

4. 阅读代码

将二叉查找树转为有序的双链表

static void tree2list_inorder(Node* root, Node*& prev, Node*& list_head)

{

  if (root->left) tree2list_inorder(root->left, prev, list_head);

 

  root->left = prev;

  if (prev) prev->right = root;

  prev = root;

  if (list_head == NULL) list_head = root;

 

  if (root->right) tree2list_inorder(root->right, prev, list_head);

}

 

Node* tree2list(Node* root)

{

  Node* list_head = NULL;

  Node* prev = NULL;

  if (root) tree2list_inorder(root, prev, list_head);

  return list_head;

}

当我看到这个标题时没有一点头绪不知道该怎么下手,该代码巧妙地利用中序遍历将二叉查找树转为有序双链表,中序遍历的特点让这个程序更加简洁。

原地址:{https://www.cnblogs.com/justin20160409/p/5438145.html}

5. 代码Git提交记录截图

posted @ 2018-05-05 19:34  看尽长安花  阅读(328)  评论(1编辑  收藏  举报