示例#1
0
文件: tree.c 项目: why0603/angel
//删除树节点,到此时的树节点,最多只有一个孩子,而且是左孩子
void DeleteTreeNode(TreePtr tree,TreeNodePtr node)
{
	TreeNodePtr brother = NULL;
	TreeNodePtr child = NULL;
	TreeNodePtr parent = NULL;

	parent = node->parent;
	child = (NULL == node->left) ? node->right : node->left;
	//child = node->left;

	//没有父节点和子女节点,是唯一一个节点,case 1
	if ((NULL == child) && (NULL == parent))
	{
		SetRootNode(tree,NULL);
	}
	else if ((NULL != child) && (NULL == parent))
	{
		//只有一个孩子节点,没有父节点,case 2
		SetRootNode(tree,child);
	}
	else if ((NULL == child) && (NULL != parent))
	{
		//没有孩子节点,有父节点
		if (node == parent->left)
		{
			SetLeftChild(parent,NULL);//child = NULL
		}
		else
		{
			SetRightChild(parent,NULL);//child = NULL
		}
		/*
		if (BlackNode == node->color)
		{
		DeleteNodeFix(tree,node);
		}
		*/
	}
	else
	{
		//有孩子节点,有父节点
		if (node == parent->left)
		{
			SetLeftChild(parent,child);//child = NULL
		}
		else
		{
			SetRightChild(parent,child);//child = NULL
		}
		//N=B但是P=R,C=R时,需要将孩子节点设置为黑色
		child->color = BlackNode;
		if (BlackNode == node->color)
		{
			//这个节点已经代替了node的位置
			DeleteNodeFix(tree,child);
		}
	}

	FreeNode(tree,node);
}
示例#2
0
文件: tree.c 项目: why0603/angel
//右旋转
void RightRotate(TreePtr tree,TreeNodePtr node)
{
	//获取节点的父节点
	TreeNodePtr parent = node->parent;

	//变为自身左孩子的右孩子
	//返回原来左孩子的右孩子(孙子),自身左右孩子没变
	TreeNodePtr right = SetRightChild(node->left,node);

	//将左孩子作为父节点的右孩子,左孩子节点空出

	//将右孩子作为父节点的(左,右)孩子,右孩子节点空出
	if (NULL != parent)
	{
		if (parent->left == node)
		{
			SetLeftChild(parent,node->left);
		}
		else
		{
			SetRightChild(parent,node->left);
		}
	}
	else
	{
		//表示是根节点,根节点没有父节点
		SetRootNode(tree,node->left);
	}

	//将之前左孩子的右孩子设置为自身的左孩子
	SetLeftChild(node,right);
}
示例#3
0
文件: tree.c 项目: why0603/angel
//左旋转
void LeftRotate(TreePtr tree,TreeNodePtr node)
{
	//获取节点的父节点
	TreeNodePtr parent = node->parent;

	//变为自身右孩子的左孩子
	//返回原来右孩子的左孩子(孙子),自身左右孩子没变
	TreeNodePtr left = SetLeftChild(node->right,node);

	//将右孩子作为父节点的(左,右)孩子,右孩子节点空出
	if (NULL != parent)
	{
		if (parent->left == node)
		{
			SetLeftChild(parent,node->right);
		}
		else
		{
			SetRightChild(parent,node->right);
		}
	}
	else
	{
		SetRootNode(tree,node->right);
	}

	//将之前右孩子的左孩子设置为右孩子
	SetRightChild(node,left);
}
示例#4
0
文件: tree.c 项目: why0603/angel
NodePosition InsertTreeNode(TreePtr tree,TreeNodePtr node)
{
	NodePosition nodePosition = CoverNode;
	Boolean ret = False;
	TreeNodePtr parent = tree->root;
	int compare = 0;
	while(NULL != parent)
	{
		compare = Compare(parent->keyValue,node->keyValue,tree->keyType,tree->keyByteSize,tree->isSigned);
		//遇到相同KEY的节点
		if (compare == Compare_Equal)
		{
			//覆盖VALUE
			memcpy(parent->keyValue + tree->keyByteSize,node->keyValue + tree->keyByteSize,tree->keyByteSize);
			ret = True;
			nodePosition = CoverNode;
			break;
		}
		else if (compare == Compare_Less)
		{
			//父节点小于当前节点,则为父节点的右孩子
			if (NULL == parent->right)
			{
				SetRightChild(parent,node);
				ret = True;
				nodePosition = RightNode;
				break;
			}
			else
			{
				parent = parent->right;
			}
		}
		else
		{
			//父节点大于当前节点,则为父节点的左孩子
			if (NULL == parent->left)
			{
				SetLeftChild(parent,node);
				ret = True;
				nodePosition = LeftNode;
				break;
			}
			else
			{
				parent = parent->left;
			}
		}
	}

	//一直到NULL都没有插入,那就是根节点了
	if (False == ret)
	{
		//tree->root = node;
		//node->color = BlackNode;
		SetRootNode(tree,node);
		nodePosition = RootNode;
	}
	return nodePosition;
}
示例#5
0
NS_IMETHODIMP
inDOMView::Rebuild()
{
  nsCOMPtr<nsIDOMNode> root;
  GetRootNode(getter_AddRefs(root));
  SetRootNode(root);
  return NS_OK;
}
bool THISCLASS::Open(const wxFileName &filename) {
	// Read the file
	wxLogNull log;
	mIsOpen = mDocument.Load(filename.GetFullPath());
	if (! mIsOpen) {
		mDocument.SetRoot(new wxXmlNode(0, wxXML_ELEMENT_NODE, wxT("swistrack")));
		SelectRootNode();
		return false;
	}

	// Select the root element and check its name
	SetRootNode(mDocument.GetRoot());
	if (GetRootNode()->GetName() != wxT("swistrack")) {
		mIsOpen = false;
		return false;
	}

	return true;
}
示例#7
0
inDOMView::~inDOMView()
{
  SetRootNode(nsnull);
}
示例#8
0
		void DecisionTree::SetRootNode(DecisionTreeNode* ip_root_node)
			{
			SetRootNode(ip_root_node->GetId());
			}
示例#9
0
文件: tree.c 项目: why0603/angel
static void CheckTree(TreePtr tree,TreeNodePtr node)
{
	//父节点,祖父节点,叔父节点
	TreeNodePtr parent,grand,uncle;//great

	//与父节点的关系(左孩子还是右孩子),父节点与祖父节点的关系
	NodePosition selfPosition,parentPosition;
	parent = node->parent;
	/*
	great = (NULL != parent) ? parent->parent : NULL;
	uncle = (NULL != great) ? ((great->left == parent) ? great->right : great->left) : NULL;
	TreeColor selfColor = node->color;
	TreeColor parentColor = (NULL != parent) ? parent->color : BlackNode;
	TreeColor uncleColor = (NULL != uncle) ? uncle->color : BlackNode;
	TreeColor greatColor = (NULL != great) ? great->color : BlackNode;
	*/
	//父节点为NULL,这表示是根节点
	if (NULL == parent)
	{
		SetRootNode(tree,node);
	}
	else if ((node->color == RedNode) && (parent->color == RedNode))
	{
		//自身节点 父节点为红色
		//这个时候一定会有一个祖父节点
		grand = parent->parent;
		uncle = (grand->left == parent) ? grand->right : grand->left;
		//自身节点 父节点 叔父节点都为红色
		if ((NULL != uncle) && (uncle->color == RedNode))
		{
			grand->color = RedNode;
			parent->color = BlackNode;
			uncle->color = BlackNode;
			CheckTree(tree,grand);
			//将祖父节点作为新插入的节点开始检测树的合法性
		}
		else  //叔父节点是黑色或者空节点
		{
			//自身节点 父节点为红色 叔父节点为黑色(NULL表示黑色)
			selfPosition = (node == parent->left) ? LeftNode : RightNode;
			parentPosition = (parent == grand->left) ? LeftNode : RightNode;
			//旋转分为 左左 左右 右左 右右
			if ((selfPosition == LeftNode) && (parentPosition == LeftNode))
			{
				/*
				G(b)                    P(b)
				/      \                 /     \
				P(r)     U(b)   -->      N(r)    G(r)
				/   \                            /    \
				N(r)    M                          M     U(b)
				*/
				RightRotate(tree,grand);
				//左左的情况需要更换节点颜色,可以知道的是祖父节点肯定是黑色
				parent->color = BlackNode;
				grand->color = RedNode;
			}
			else if ((parentPosition == RightNode) && (selfPosition == LeftNode))
			{
				//右左
				//以父节点右转,这个时候将变成右右的关系
				RightRotate(tree,parent);
				//要是减少递归,可以再转一次
				//CheckTree(tree,node);
				LeftRotate(tree,grand);
				parent->color = BlackNode;
				grand->color = RedNode;
			}
			else if ((parentPosition == LeftNode) && (selfPosition == RightNode))
			{
				//左右
				//以父节点左转,这个时候将变成左左的关系
				LeftRotate(tree,parent);
				//下次检测则会发现是左左关系
				//要是减少递归,可以再转一次
				//CheckTree(tree,node);
				RightRotate(tree,grand);
				parent->color = BlackNode;
				grand->color = RedNode;
			}
			else
			{
				//右右
				/*
				G(b)                    P(b)
				/      \                 /    \
				U(b)     P(r)   -->      G(r)   N(r)
				/     \          /   \
				M      N(r)     U(b)   M
				*/
				LeftRotate(tree,grand);
				parent->color = BlackNode;
				grand->color = RedNode;
			}
		}
		//这里发现祖父节点肯定被染成了红色,而父节点都被染成黑色
		//因为插入的是红色节点,而一个红节点必须包含两个黑色节点
		//·
	}
	else
	{
		//这样表示调整基本完毕
	}
}