博客作业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}