二叉树的实现

严蔚敏版的《数据结构与算法》一书,已经接触过有一段很长的时间了。

自己半路出家做软件开发不知不觉也超过了10年,其中接触过软件开发、windows驱动、安全研究、逆向、漏洞挖掘等业务,一路走来跌跌撞撞,目前感觉自己仍然比较菜,一直处于绿叶和菜心的位置。再加上平时面临KPI考核、生活琐事的羁绊,技术一直无法快速迭代和发展进步。最近又面临岗位调整,实在是很难静下心来,排除一切世俗世界,深入的研究数据结构和算法。

言归正传。

本程序跟栈、队列、list、图等其他数据结构的实现一样简单,包括二叉树的插入(如果已经有相同的键值则不插入)、查找、删除、中序遍历等几个模块。

完整工程代码地址:https://github.com/satadriver/dataStruct

头文件:

#pragma once

#include "Element.h"
#include "queue.h"
#include "list.h"
#include "stack.h"

#pragma pack(1)

typedef struct  _TREE
{
	_TREE* parent;
	_TREE* lchild;
	_TREE* rchild;

	ELEMENT data;
}TREE;

#pragma pack()

class Tree {
public:
	Tree();
	~Tree();

	int insert(ELEMENT* e);

	int remove(ELEMENT* e);

	TREE* search(ELEMENT* e);

	int ltr(List* list);
	int LTR(TREE* t, List* list, Stack* s);

	int rtr(List* list);

	int mtr(List* list);
private:
	int mSize;
	TREE* mTree;

};

cpp文件:




#include "tree.h"
#include "queue.h"
#include "list.h"
#include "stack.h"

Tree::Tree() {
	mTree = 0;
	mSize = 0;
}


Tree::~Tree() {
	List list;
	ltr(&list);

	list.clear();

	if (mTree)
	{
		delete mTree;
	}
}


int Tree::insert(ELEMENT* e) {
	if (mTree == 0)
	{
		mTree = new TREE;
		mTree->data.e = e->e;
		mTree->parent = 0;
		mTree->lchild = 0;
		mTree->rchild = 0;
		mSize = 1;
		return 1;
	}

	TREE* t = mTree;

	while (1) {
		if (e->e == t->data.e) {
			return 0;
		}
		else if (e->e > t->data.e)
		{
			if (t->rchild == 0)
			{
				TREE* newt = new TREE;
				newt->data.e = e->e;
				newt->lchild = 0;
				newt->rchild = 0;
				newt->parent = t;
				t->rchild = newt;
				mSize++;
				break;
			}
			else {
				t = t->rchild;
			}
		}
		else {
			if (t->lchild == 0)
			{
				TREE* newt = new TREE;
				newt->data.e = e->e;
				newt->lchild = 0;
				newt->rchild = 0;
				newt->parent = t;

				t->lchild = newt;
				mSize++;
				break;
			}
			else {
				t = t->lchild;
			}
		}
	}

	return 0;
}

int Tree::remove(ELEMENT* e) {

	TREE* t = search(e);
	if (t == 0)
	{
		return 0;
	}

	TREE* parent = t->parent;
	TREE* lchild = t->lchild;
	TREE* rchild = t->rchild;

	if (lchild == 0 && rchild == 0)
	{
		if (parent == 0 || t == mTree) {
			delete mTree;
			mTree = 0;
		}
		else if (parent->lchild == t)
		{
			parent->lchild = 0;
		}
		else if (parent->rchild == t)
		{
			parent->rchild = 0;
		}
		else {

		}
	}
	else if (lchild == 0)
	{
		if (parent == 0 || t == mTree) {
			delete mTree;
			mTree = rchild;
			rchild->parent = 0;
		}
		else if (parent->lchild == t)
		{
			parent->lchild = rchild;
		}
		else if (parent->rchild == t)
		{
			parent->rchild = rchild;
		}
		else {

		}
	}
	else if (rchild == 0)
	{
		if (parent == 0 || t == mTree) {
			delete mTree;
			mTree = lchild;
			lchild->parent = 0;
		}
		else if (parent->lchild == t)
		{
			parent->lchild = lchild;
		}
		else if (parent->rchild == t)
		{
			parent->rchild = lchild;
		}
		else {

		}
	}
	else {
		//left subtree upwards and move right subtree ,or right subtree upwards and move left subtree
		if (parent == 0 || t == mTree) {
			TREE* tmp = lchild;
			while (tmp->rchild)
			{
				tmp = tmp->rchild;
			}
			rchild->parent = tmp;
			tmp->rchild = rchild;
			lchild->parent = 0;
			delete mTree;
			mTree = lchild;
		}
		else if (parent->lchild == t)
		{
			parent->lchild = lchild;
			lchild->parent = parent;

			TREE* tmp = lchild;
			while (tmp->rchild)
			{
				tmp = tmp->rchild;
			}
			tmp->rchild = rchild;
			rchild->parent = tmp;


			/*parent->lchild = rchild;
			rchild->parent = parent;

			TREE* tmp = rchild;
			while (tmp->lchild)
			{
				tmp = tmp->lchild;
			}
			tmp->lchild = lchild;
			lchild->parent = tmp; */

		}
		else if (parent->rchild == t)
		{
			parent->rchild = lchild;
			lchild->parent = parent;

			TREE* tmp = lchild;
			while (tmp->rchild)
			{
				tmp = tmp->rchild;
			}
			tmp->rchild = rchild;
			rchild->parent = tmp;


			/*
			parent->rchild = rchild;
			rchild->parent = parent;

			TREE* tmp = rchild;
			while (tmp->lchild)
			{
				tmp = tmp->lchild;
			}
			tmp->lchild = lchild;
			lchild->parent = tmp;*/
		}
		else {
			return 0;
		}
	}

	return 0;
}


TREE* Tree::search(ELEMENT* e) {
	if (mTree == 0)
	{
		return 0;
	}

	TREE* t = mTree;

	while (1) {
		if (e->e == t->data.e) {
			return t;
		}
		else if (e->e > t->data.e)
		{
			if (t->rchild == 0)
			{
				break;
			}
			else {
				t = t->rchild;
			}
		}
		else {
			if (t->lchild == 0)
			{
				break;
			}
			else {
				t = t->lchild;
			}
		}
	}

	return 0;
}

int Tree::LTR(TREE* t, List* list, Stack* s) {

	int cnt = 0;

	ELEMENT e;

	if (t == 0)
	{
		return cnt;
	}

	while (t->lchild)
	{
		e.e = (unsigned __int64)t;
		s->push(&e);

		t = t->lchild;
	}

	e.e = (unsigned __int64)t;
	e.data = t->data.data;
	list->insert(&e);
	cnt++;
	printf("get LTR element:%lld value:%lld\r\n", e.e, t->data.e);

	if (t->rchild)
	{
		t = t->rchild;
		cnt += LTR(t, list, s);
	}

	while (s->isEmpty() == 0)
	{
		s->pop(&e);

		t = (TREE*)e.e;

		list->insert(&e);
		cnt++;
		printf("get LTR element:%lld value:%lld\r\n", e.e, t->data.e);

		t = t->rchild;

		cnt += LTR(t, list, s);
	}

	return cnt;
}

int Tree::ltr(List* list) {
	int cnt = 0;
	TREE* t = mTree;
	if (t == 0)
	{
		return 0;
	}

	Stack s;


	cnt = LTR(t, list, &s);

	return cnt;
}

int Tree::rtr(List* list) {
	return 0;
}

int Tree::mtr(List* list) {
	return 0;
}

你可能感兴趣的:(数据结构和算法,数据结构,算法)