All pastes #91874 Raw Edit

Unnamed

public text v1 · immutable
#91874 ·published 2006-07-19 00:22 UTC
rendered paste body
#include <iostream>
using namespace std;
#include "tree.h"
#include <assert.h>

Tree::Tree() { rootPtr=0; }
 
void Tree::insertNode(treenode * &ptr, const int &value)
{
        if(ptr==0)
		{
                ptr=new treenode;
                assert( ptr !=0);
                ptr->data=value;
                ptr->leftPtr=0;
                ptr->rightPtr=0;
        }
        else
                if( value < ptr->data)
                        insertNode( ptr->leftPtr, value);
                else
                        if( value  > ptr->data)
                                insertNode( ptr->rightPtr, value);
                        else
                                cout << value << " dup " << endl;
}
 
void Tree::preOrderTraversal(treenode* ptr)
{
        if(ptr !=0){
                cout << ptr->data << " ";
                preOrderTraversal(ptr->leftPtr);
                preOrderTraversal(ptr->rightPtr);
        }
}
 
void Tree::inOrderTraversal(treenode * ptr)
{
        if (ptr !=0)
		{
                inOrderTraversal(ptr->leftPtr);
                cout << ptr->data << " ";
                inOrderTraversal(ptr->rightPtr);
        }
}
 
void Tree::postOrderTraversal(treenode * ptr)
{
        if( ptr !=0){
                postOrderTraversal(ptr->leftPtr);
                postOrderTraversal(ptr->rightPtr);
                cout << ptr->data << " ";
        }
}
Tree::~Tree()
{
        cout << " entering destructor\n";
        DeleteHelper(rootPtr);
}
 
void Tree::DeleteHelper(treenode * ptr)
{
        if(ptr !=0){
                DeleteHelper(ptr->leftPtr);
                DeleteHelper(ptr->rightPtr);
                cout << " deleting: "<< ptr->data << endl;
                delete ptr;
        }
}
void Tree::findNode(treenode * ptr, int value,treenode* priorPtr, treenode *& nodePtr, treenode *& parentPtr)
{
        if(ptr==0){
                nodePtr=0;
                parentPtr=priorPtr;
                //we have found where it goes but it isn't there
        }
        else
                if( value  < ptr->data)
                        findNode( ptr->leftPtr, value, ptr, nodePtr, parentPtr);
                else
                        if( value > ptr->data)
                                findNode( ptr->rightPtr, value, ptr, nodePtr, parentPtr);
                        else
                        {
                                nodePtr=ptr;
                                parentPtr=priorPtr;
                        }
}
void Tree::deleteItem(int value)
{
        bool found;
        Delete(rootPtr, value, found);
        if(!found)
                cout << value << " was not found " << endl;
} 

void Tree::DeleteNode(treenode * &tree)
{
	int value;
	bool found;
	treenode * tempPtr;
	tempPtr = tree;
	if(tree->leftPtr = 0)
	{
		tree = tree->rightPtr;
		delete tempPtr;
	}
	else if (tree->rightPtr == 0)
	{
		tree = tree->leftPtr;
		delete tempPtr;
	}
	else
	{
		GetPredecessor(tree->leftPtr, value);
		tree->data = value;
		Delete(tree->leftPtr, value, found);
		if(!found)
		{
			cout << "error in delete after getpredecesor" << endl;
		}
	}
}

void Tree::GetPredecessor(treenode * tree, int &value)
{
	while(tree->rightPtr != 0)
	{
		tree = tree->rightPtr;
	}
	value = tree->data;

}

void Tree::Delete(treenode * &tree, int item, bool &found)
{

	if(tree == 0)
	{
		found = false;
		return;
	}
	if(item < tree->data)
	{
		Delete(tree->leftPtr, item, found);
	}
	else if(item > tree->data)
	{
		Delete(tree->rightPtr, item, found);
	}
	else
	{
		found = true;
		DeleteNode(tree);
	}
}