父亲节点的实现

  在做Jena推导owl本体文件的一个项目的时候,遇到要实现记录每个节点的父节点的情况,

一开始想的是通过树形的数据结构来做,但后来发现这个很难,因为每次更新树的时候,不知道

怎么将新的子节点传给树,对数做一个更新,而且树中并没有存放那个节点是那个节点的父节点这样的信息。

起始这个问题只需要对访问过的节点定义一个List,将访问过的节点加入到这个List中,然后对与这个List,建立一个

fatherList,用来存放这些节点的父节点,问题就很好的解决了,虽然对于多个节点对应同一个父节点的情况,有一点浪费

存储空间,但是编码要简单的多。

感悟:这个方法是自己突然想到《图论》中的最短路径的方法(Dijkstra)中是这样记录父节点后想到的,所以

有些时候看书的时候觉得书中的方法很简单,自己很容易就能够理解,但是当自己遇到同样的问题的时候,却一直想不到

书中那些很简单但是很好的方法。这告诉我们要多多回味一些经典的算法,里面有很多我们没有真正理解的东西。

时间: 2024-12-16 23:31:44

父亲节点的实现的相关文章

Codeforces Round #353 (Div. 2) D. Tree Construction (BST询问父亲节点)

原题请戳这里 题意: 给出n个不同的数,按照给出的顺序构造二叉排序树BST,第1个数为根节点.输出2-n个 节点的父亲节点. 分析: 二叉排序树的平均复杂度是log2n,最坏情况下变成线性的,复杂度为n. 对n个节点的插入操作如果用结构体指针的写法最坏情况下为n2=1010,这样会超时. 开始没有注意这点,TLE.但是正好复习了BST的插入操作递归和非递归的写法. 易知,插入的数的父亲节点是已插入的比它大或者比它小的与其最接近的数之一. 这个题利用set保存输入的数,用两个map分别记录左右孩子

C++线索二叉树求最矮公共父亲节点

#include <iostream> #include <stdlib.h> #include <stack> using namespace std; class Expection//一个自定义的异常类 { public: void Null_Thing()//空指针异常. { cout<<"Expection!!!,this is null"<<endl; exit (0); } }; template<type

C++二叉搜索树(带父亲节点,2种节点删除方法的比较.)

这里写代码片#include <iostream> #include <iomanip> using namespace std; template<typename Type> class BSTNode { public: Type data; BSTNode<Type> *left; BSTNode<Type> *right; BSTNode<Type> *parent;//带父亲节点的搜索二叉树. BSTNode(Type d

QTreeWidget系列--QTreeWidgetItem可随意移动(拖拽),更换父亲节点

方法分如下两步: 第一步,在datatree类(继承自qtreewidget)的构造函数中设置这棵树具有如下两种特征: setDefaultDropAction(Qt::MoveAction); setDragDropMode(QAbstractItemView::DragDrop); 第二步,重写 startdrag()函数,在里面写上如下代码: void CDataTree::startDrag(Qt::DropActions /*supportedActions*/) { QMimeDat

二叉搜索树建立、插入、删除、前继节点、后继节点之c++实现

一.前言 一直以来,都对树有关的东西望而却步.以前每次说要看一看,都因为惰性,时间就那么荒废掉了.今天下个决心,决定好好的数据结构中的东西看一下.不知道看这篇文章的你,是不是和我有同样的感受,空有一颗努力的心,却迟迟没有付出行动.如果是的话,如果也想好好的把树的知识巩固一下的话,就让我们一起好好儿地把知识点过一遍吧.本文争取让看完的每一个没有基础的同学,都能有所收获.在正文开始前,先给自己加个油.加油(^ω^) 二.二叉搜索树的定义 二叉搜索树是指,对于某一个节点而言,它左边的节点都小于或等于它

红黑树之删除节点

红黑树之删除节点 上一篇文章中讲了如何向红黑树中添加节点,也顺便创建了一棵红黑树.今天写写怎样从红黑树中删除节点. 相比于添加节点,删除节点要复杂的多.不过我们慢慢梳理,还是能够弄明白的. 回顾一下红黑树的性质 红黑树是每个节点都带有颜色属性的二叉查找树,颜色或红色或黑色.在二叉查找树强制一般要求以外,对于任何有效的红黑树我们增加了如下的额外要求: 节点是红色或黑色. 根节点是黑色. 每个叶节点(这里的叶节点是指NULL节点,在<算法导论>中这个节点叫哨兵节点,除了颜色属性外,其他属性值都为任

js学习总结----DOM中的节点和关系属性

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <div id="div1"> <h1>培训课程</h1> <ul> <li>html+css&

jquery的父子兄弟节点查找示例代码

jQuery.parent(expr) 找父亲节点,可以传入expr进行过滤,比如$("span").parent()或者$("span").parent(".class") jQuery.parents(expr),类似于jQuery.parents(expr),但是是查找所有祖先元素,不限于父元素 jQuery.children(expr).返回所有子节点,这个方法只会返回直接的孩子节点,不会返回所有的子孙节点 jQuery.contents

【数据结构】堆的实现(包括:默认成员函数,插元素push,删元素pop,访问根节点top,判空,大小)

在数据结构里,堆是一类很重要的结构.堆结构是一组数组对象,我们可以把它当作是一颗完全二叉树. 最大堆:堆里每一个父亲节点大于它的子女节点. 最小堆:堆里每一个父亲节点小于它的子女节点. 如图就是一个最大堆: 实现代码时我的测试序列是:int a[] = { 10, 11, 13, 12, 16, 18, 15, 17, 14, 19 }; 我们把它的图画出来,便于分析. 实现代码如下: 建立头文件heap.hpp #define _CRT_SECURE_NO_WARNINGS 1 #includ