⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 searchtree.cc

📁 Mesa is an open-source implementation of the OpenGL specification - a system for rendering interacti
💻 CC
字号:
/*** License Applicability. Except to the extent portions of this file are** made subject to an alternative license as permitted in the SGI Free** Software License B, Version 1.1 (the "License"), the contents of this** file are subject only to the provisions of the License. You may not use** this file except in compliance with the License. You may obtain a copy** of the License at Silicon Graphics, Inc., attn: Legal Services, 1600** Amphitheatre Parkway, Mountain View, CA 94043-1351, or at:** ** http://oss.sgi.com/projects/FreeB** ** Note that, as provided in the License, the Software is distributed on an** "AS IS" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS** DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND** CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A** PARTICULAR PURPOSE, AND NON-INFRINGEMENT.** ** Original Code. The Original Code is: OpenGL Sample Implementation,** Version 1.2.1, released January 26, 2000, developed by Silicon Graphics,** Inc. The Original Code is Copyright (c) 1991-2000 Silicon Graphics, Inc.** Copyright in any portions created by third parties is as indicated** elsewhere herein. All Rights Reserved.** ** Additional Notice Provisions: The application programming interfaces** established by SGI in conjunction with the Original Code are The** OpenGL(R) Graphics System: A Specification (Version 1.2.1), released** April 1, 1999; The OpenGL(R) Graphics System Utility Library (Version** 1.3), released November 4, 1998; and OpenGL(R) Graphics with the X** Window System(R) (Version 1.3), released October 19, 1998. This software** was created using the OpenGL(R) version 1.2.1 Sample Implementation** published by SGI, but has not been independently verified as being** compliant with the OpenGL(R) version 1.2.1 Specification.**** $Date: 2001/03/17 00:25:41 $ $Revision: 1.1 $*//*** $Header: /home/krh/git/sync/mesa-cvs-repo/Mesa/src/glu/sgi/libnurbs/nurbtess/searchTree.cc,v 1.1 2001/03/17 00:25:41 brianp Exp $*/#include <stdlib.h>#include <stdio.h>#include "zlassert.h"#include "searchTree.h"#define max(a,b) ((a>b)? a:b)treeNode* TreeNodeMake(void *key){  treeNode *ret = (treeNode*) malloc(sizeof(treeNode));  assert(ret);  ret->key = key;  ret->parent = NULL;  ret->left = NULL;  ret->right = NULL;  return ret;}void TreeNodeDeleteSingleNode(treeNode* node){  free(node);}void TreeNodeDeleteWholeTree(treeNode* node){  if(node == NULL) return;  TreeNodeDeleteWholeTree(node->left);  TreeNodeDeleteWholeTree(node->right);  TreeNodeDeleteSingleNode(node);}void TreeNodePrint(treeNode* node, 		   void (*keyPrint) (void*)){  if(node ==NULL) return;  TreeNodePrint(node->left, keyPrint);  keyPrint(node->key);  TreeNodePrint(node->right, keyPrint);  }int TreeNodeDepth(treeNode* root){  if(root == NULL) return 0;  else{    int leftdepth = TreeNodeDepth(root->left);    int rightdepth = TreeNodeDepth(root->right);      return 1 + max(leftdepth, rightdepth);  }}/*return the node with the key. *NULL is returned if not found */treeNode* TreeNodeFind(treeNode* tree, void* key,		       int (*compkey) (void*, void*)) 	       {  if(tree == NULL)     return NULL;  if(key == tree->key)    return tree;  else if(compkey(key, tree->key) < 0)    return TreeNodeFind(tree->left, key, compkey);  else     return TreeNodeFind(tree->right, key, compkey);    }treeNode* TreeNodeInsert(treeNode* root, treeNode* newnode,		    int (*compkey) (void *, void *)){  treeNode *y = NULL;  treeNode *x = root;  /*going down the tree from the root.   *x traces the path, y is the parent of x.   */  while (x != NULL){    y = x;    if(compkey(newnode->key,x->key) < 0) /*if newnode < x*/      x = x->left;    else       x = x->right;  }  /*now y has the property that    * if newnode < y, then y->left is NULL   * if newnode > y, then y->right is NULL.   *So we want to isnert newnode to be the child of y   */  newnode->parent = y;  if(y == NULL)     return newnode;  else if( compkey(newnode->key, y->key) <0)    {      y->left = newnode;    }  else    {      y->right = newnode;    }  return root;}    treeNode* TreeNodeDeleteSingleNode(treeNode* tree, treeNode* node){  treeNode* y;  treeNode* x;  treeNode* ret;  if(node==NULL) return tree;  if(node->left == NULL || node->right == NULL) {    y = node;    if(y->left != NULL)       x = y->left;    else      x = y->right;    if( x != NULL)      x->parent = y->parent;    if(y->parent == NULL) /*y is the root which has at most one child x*/      ret = x;    else /*y is not the root*/      {	if(y == y->parent->left) 	  y->parent->left = x;	else	  y->parent->right = x;	ret =  tree;      }  }  else { /*node has two children*/     y = TreeNodeSuccessor(node);     assert(y->left == NULL);     if(y == node->right) /*y is the right child if node*/       {	 y->parent = node->parent;	 y->left = node->left;	 node->left->parent = y;	        }     else  /*y != node->right*/       {	 x = y->right;	 if(x!= NULL)	   x->parent = y->parent;	 assert(y->parent != NULL);	 if(y == y->parent->left) 	   y->parent->left = x;	 else	   y->parent->right = x;	 /*move y to the position of node*/	 y->parent = node->parent;	 y->left = node->left;	 y->right = node->right;	 node->left->parent = y;	 node->right->parent = y;       }    if(node->parent != NULL) {      if(node->parent->left == node)	node->parent->left = y;      else	node->parent->right = y;      ret = tree; /*the root if the tree doesn't change*/    }    else /*node->parent is NULL: node is the root*/      ret = y;      }  /*finally free the node, and return the new root*/  TreeNodeDeleteSingleNode(node);  return ret;}     /*the minimum node in the tree rooted by node */treeNode* TreeNodeMinimum(treeNode* node){  treeNode* temp = node;  if(temp == NULL) return NULL;  while(temp->left != NULL) {    temp = temp->left;  }  return temp;}/*the maximum node in the tree rooted by node */treeNode* TreeNodeMaximum(treeNode* node){  treeNode* temp = node;  if(temp == NULL) return NULL;  while(temp->right != NULL) {    temp = temp->right;  }  return temp;}/*return the first node (in sorted order) which is to the right of this node */treeNode* TreeNodeSuccessor(treeNode* node){  if(node == NULL) return NULL;  if(node->right != NULL)    return TreeNodeMinimum(node->right);  else{ /*node->right is NULL*/    /*find the first right-ancestor*/    treeNode *y = node->parent;    treeNode* x = node;    while(y != NULL && x == y->right) /*if y is a left parent of x*/      {	x = y;	y = y->parent;      }    return y;  }}/*return the first node (in sorted order) which is to the left of this node */treeNode* TreeNodePredecessor(treeNode* node){  if(node == NULL) return NULL;  if(node->left != NULL)    return TreeNodeMaximum(node->left);  else{ /*node->left is NULL*/    /*find the first left-ancestor*/    treeNode *y = node->parent;    treeNode *x = node;    while(y != NULL && x == y->left) /*if y is a right parent of x*/      {	x = y;	y = y->parent;      }    return y;  }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -