树2——删除节点与求度,高度
来源:互联网 发布:德州扑克 mac 编辑:程序博客网 时间:2024/06/14 06:52
接着上一次的内容,本文继续介绍一些关于树的操作。
删除节点:
TreeNode* current = tree->head->next; for (i = 0; i < pos; i++) { current = current->next; } *x = current->data; r_delete(tree, current);
删除一个节点,我们必须删除这个节点以及他的“子子孙孙”,这样用一般的方法就很难操作,于是我们可以引入递归的思想,从他的“子子孙孙”开始删除,一直删到他自己。这样就比较简单了。当然之前我们必须遍历树将他找到,在进行递归删除。
下面是递归删除函数内容:
// 从树链表中移除这个结点,找node的前一个结点 TreeNode* tmp = tree->head; // 链表的头节点 while (tmp->next) { if (tmp->next == node) { tmp->next = node->next; tree->len --; break; } tmp = tmp->next; } // 将父亲结点中子结点链表中指向node的结点删除 TreeNode* parent = node->parent; if (parent != NULL) { ChildNode* tmp = parent->childList; // 子结点链表的头节点 while (tmp->next) { if (tmp->next->childNode == node) { ChildNode* p = tmp->next; tmp->next = p->next; free(p); parent->degree--; break; } tmp = tmp->next; } } // 将该结点的孩子结点删掉 ChildNode* child = node->childList->next; // 子结点链表中的第一个结点 while (child) { ChildNode* pchild = child->next; r_delete(tree, child->childNode); child = pchild; } free (node->childList); free (node);
其基本的思想就是删自己和自己的孩子,然后孩子又删自己和自己的孩子,如此下去。。。整个过程与插入一样都是比较复杂的。
求树高度:
int r_height(TreeNode* node){ if (node == NULL) return 0; int subHeight = 0; int max = 0; ChildNode* child = node->childList->next; while (child) { subHeight = r_height(child->childNode); if (subHeight > max) max = subHeight; child = child->next; } return max + 1;}
求树的高度,换句话说不就是求他子树中最高那棵的高度再加上一吗?这样又用到了递归的思想,递归函数如上。这样就相对简单许多了,也比较好理解了。
求树的度:
int r_degree(TreeNode* node){ if (node == NULL) return 0; int max = node->degree; int subDegree = 0; ChildNode* child = node->childList->next; while (child) { subDegree = r_degree(child->childNode); if (subDegree > max) max = subDegree; child = child->next; } return max;}
获取树的度与获取高度很相似,同样也用到了递归的思想,由此可见递归的思想还是很重要的,在这三个操作中都用到了递归的思想。
关于树的操作远远不止这些但其他的一些相对这几个操作就简单许多了,所以就不多讲了。
阅读全文
0 0
- 树2——删除节点与求度,高度
- 二叉树2——删除节点与求度,高度
- 求二叉树的节点总数与高度
- 二叉树求高度、叶子节点个数、总节点个数
- 二叉树遍历、高度与节点数
- 求二叉树的节点总数及树的高度
- HDU 2193 AVL树(给节点求最大高度)
- java语言实现的二叉树的各种操作(包括递归与非递归遍历二叉树,求二叉树的高度,节点总数,叶子节点等)
- 求二叉树的高度与宽度
- 递归遍历 二叉树 求高度 和 节点数 和 叶子节点数
- 求二叉树的高度,宽度、节点个数、叶子节点个数
- 二叉树插入、删除、递归求高度、度、前序、中序、后序遍历
- 二叉树的创建,插入,删除,输出,求高度,求度以及三种遍历方式实现
- 二叉搜索树——删除节点
- 删除二叉树中的节点——归并删除法
- 算法与数据结构基础11:C++实现——二叉搜索树节点删除
- 二叉树节点的插入与删除
- 经典算法学习——求二叉树的高度
- tomcat 性能优化
- POJ2001 Shortest Prefixes 动态字典树实现
- Educational Codeforces Round 26 D (dp好题)
- 【bzoj1078】[SCOI2008]斜堆
- HTTP API 接口安全设计
- 树2——删除节点与求度,高度
- 进程间通信-fifo
- Hibernate中Session与本地线程绑定
- iOS7 巨耗电三大修复方法大公开
- 如何调试Vue项目
- String的compareTo方法的详细说明
- Add Two Numbers
- python实现逆序输出一个数字
- 关于链表的插入、删除和逆置