C/C++ 二叉查找樹(二元搜尋樹)[BINARY SEARCH TREE] —— 插入、遍歷、查找、刪除、銷毀

C/C++ 二叉查找樹(二元搜尋樹)[BINARY SEARCH TREE] —— 插入、遍歷、查找、刪除、銷毀

C/C++ 二叉查找樹(二元搜尋樹)[BINARY SEARCH TREE] —— 插入、遍歷、查找、刪除、銷毀


資料來源: https://blog.csdn.net/xinxudongstudy/article/details/88564909


GITHUB: https://github.com/jash-git/CB_CPP_BST


CODE:

main.cpp

#include <iostream>
#include <cstdlib>
#include "BST.h"
using namespace std;


/*********************************************************
二叉查找樹 —— 插入、遍歷、查找、刪除、銷毀
https://blog.csdn.net/xinxudongstudy/article/details/88564909
*********************************************************/

int main()
{
	/***********************
	          插入
	***********************/
	BSTree *tree = new BSTree();
	int array[7] = {11, 33, 18, 24, 44, 66, 10};
	cout << "二叉樹數值:" << endl;
	for (int i = 0; i < 7; i++)
	{
		cout << array[i] << " ";
		tree->insert(array[i]);  //調用插入函數,生成二叉查找樹
	}

	cout << endl << endl;


	/***********************
	          遍歷
	***********************/
	cout << "前序遍歷:";
	tree->PreOrder();
	cout << endl;

	cout << "中序遍歷:";
	tree->InOrder();
	cout << endl;

	cout << "後序遍歷:";
	tree->PostOrder();
	cout << endl << endl;


	/***********************
	          查找
	***********************/
	int keyword;  //查找節點的關鍵字
	cout << "請輸入要查找的節點:";
	cin >> keyword;
	cout << endl;
	BSTNode *node = tree->IteratorSearch(keyword);  //獲取數值的地址
	if (node)  //判斷有沒有地址
	{
		cout << "關鍵字為“" << keyword << "”的節點,存在。" << endl ;
	}
	else
	{
		cout << "關鍵字為“" << keyword << "”的節點,不存在。" << endl;
	}
	cout << endl << endl;


	/***********************
	          刪除
	***********************/
	int DelNode;  //要刪除的節點
	cout << "請輸入要刪除的節點:";
	cin >> DelNode;
	tree->remove(DelNode);
	cout << endl;

	cout << "刪除操作後,(前序)遍歷:";
	tree->PreOrder();
	cout << endl;
	cout << "刪除操作後,(中序)遍歷:";
	tree->InOrder();
	cout << endl;
	cout << "刪除操作後,(後序)遍歷:";
	tree->PostOrder();
	cout << endl << endl;


	/***********************
	          銷毀
	***********************/
	tree->destroy();

    return 0;
}

BST.cpp

#include "BST.h"

BSTree::BSTree() :root(NULL) {};  //构造函数

BSTree::~BSTree()  //析构函数
{
	destroy();
}


void BSTree::insert(int key)  //将key节点插入到二叉树中
{
	BSTNode *z = new BSTNode(key, NULL, NULL, NULL);  //根据插入的key生成新的二叉树节点(z)
	if (z == NULL)
	{
		return;  //如果z里面的值为空,则停止函数的执行
	}
	insert(root, z);  //把新生的节点(z)传入树根
}


void BSTree::PreOrder(BSTNode *tree)  //前序二叉树遍历
{
	if (tree != NULL)
	{
		cout << tree->key << " ";
		PreOrder(tree->left);
		PreOrder(tree->right);
	}
}
void BSTree::PreOrder()
{
	PreOrder(root);  //传入根节点
}


void BSTree::InOrder(BSTNode *tree)  //中序二叉树遍历
{
	if (tree != NULL)
	{
		InOrder(tree->left);
		cout << tree->key << " ";
		InOrder(tree->right);
	}
}
void BSTree::InOrder()
{
	InOrder(root);  //传入根节点
}


void BSTree::PostOrder(BSTNode *tree)  //后序二叉树遍历
{
	if (tree != NULL)
	{
		PostOrder(tree->left);
		PostOrder(tree->right);
		cout << tree->key << " ";
	}
}
void BSTree::PostOrder()
{
	PostOrder(root);  //传入根节点
}


BSTNode *BSTree::search(BSTNode *x, int key)  //递归实现,在”二叉树x“中查找key节点
{
	if (x == NULL || key == x->key)
	{
		return x;
	}
	if (key < x->key)
	{
		return search(x->left, key);
	}
	else
	{
		return search(x->right, key);
	}
}
BSTNode *BSTree::search(int key)
{
	return search(root, key);  //传入根节点和待查找的关键字key
}


BSTNode *BSTree::IteratorSearch(BSTNode *x, int key)  //迭代实现,在“二叉树x”中查找key节点
{
	while (x != NULL && key != x->key)
	{
		if (key < x->key)
		{
			x = x->left;
		}
		else
		{
			x = x->right;
		}
	}
	return x;
}
BSTNode *BSTree::IteratorSearch(int key)
{
	return IteratorSearch(root, key);  //传入根节点和待查找的关键字key
}


BSTNode *BSTree::minimum(BSTNode *tree)  //查找最小节点:返回tree为根节点的二叉树的最小节点。
{
	if (tree == NULL)
	{
		return NULL;
	}
	while (tree->left != NULL)
	{
		tree = tree->left;
	}
	return tree;
}


BSTNode *BSTree::maximum(BSTNode *tree)  //查找最大节点:返回tree为根节点的二叉树的最大节点。
{
	while (tree->right != NULL)
	{
		tree = tree->right;
	}
	return tree;
}


BSTNode *BSTree::successor(BSTNode *x)  //找节点(x)的后继节点,也就是该节点的右子树中的最小节点
{
	BSTNode *y = NULL;
	if (x->right != NULL)
	{
		return minimum(x->right);
	}

// 如果x没有右子节点。则x有以下两种可能:
// (1) x是"一个左子节点",则"x的后继节点"为 "它的父节点"。
// (2) x是"一个右子节点",则查找"x的最低的父节点,并且该父节点要具有左子节点",找到的这个"最低的父节点"就是"x的后继节点"。

	y  = x->parent;
	while (y != NULL && x == y->right)
	{
		x = y;
		y = y->parent;
	}
	return y;
}


BSTNode *BSTree::predecessor(BSTNode *x)  //找节点(x)的前驱节点是该节点的左子树中的最大节点。
{
	BSTNode *y = NULL;
	if (x->left != NULL)
	{
		return maximum(x->left);
	}

// 如果x没有左子节点。则x有以下两种可能:
//(1)x是"一个右子节点",则"x的前驱节点"为 "它的父节点"。
//(2)x是"一个左子节点",则查找"x的最低的父节点,并且该父节点要具有右子节点",找到的这个"最低的父节点"就是"x的前驱节点"。

	y = x->parent;
	while (y != NULL && x == y->left)
	{
		x = y;
		y = y->parent;
	}
	return y;
}


void BSTree::insert(BSTNode *&tree, BSTNode *z)  // 将节点(z)插入到二叉树(tree)中
{
	BSTNode *y = NULL;
	BSTNode *x = tree;

	while (x != NULL)  // 查找z的插入位置
	{
		y = x;
		if (z->key < x->key)
		{
			x = x->left;
		}
		else
		{
			x = x->right;
		}
	}

	z->parent = y;
	if (y == NULL)
	{
		tree = z;
	}
	else
		if (z->key < y->key)
		{
			y->left = z;
		}
		else
		{
			y->right = z;
		}
}


BSTNode *BSTree::remove(BSTNode *tree, BSTNode *z)  // 删除二叉树(tree)中的节点(z),并返回被删除的节点
{
	BSTNode *x = NULL;
	BSTNode *y = NULL;

	if (z->left == NULL || z->right == NULL)
	{
		y = z;
	}
	else
	{
		y = successor(z);
	}

	if (y->left != NULL)
	{
		x = y->left;
	}
	else
	{
		x = y->right;
	}

	if (x != NULL)
	{
		x->parent = y->parent;
	}

	if (y->parent == NULL)
	{
		tree = x;
	}
	else
		if (y == y->parent->left)
		{
			y->parent->left = x;
		}
		else
		{
			y->parent->right = x;
		}

	if (y != z)
	{
		z->key = y->key;
	}
	return y;
}


void BSTree::remove(int key)  // 删除二叉树(tree)中的节点(z),并返回被删除的节点
{
	BSTNode *z, *node;
	z = IteratorSearch(root, key);  //根据给定的key,查找树中是否存在key节点
	if (z != NULL)
	{
		node = remove(root, z);  //传入树根以及待删除的节点(z)
		if (node != NULL)
		{
			delete node;
		}
	}
}


void BSTree::destroy(BSTNode *&tree)  //销毁二叉树
{
	if (tree == NULL)
	{
		return;  //停止函数的执行
	}
	if (tree->left != NULL)
	{
		return destroy(tree->left);
	}
	if (tree->right != NULL)
	{
		return destroy(tree->right);
	}
	delete tree;
	tree = NULL;
}


void BSTree::destroy()  //销毁二叉树
{
	destroy(root);
}

BST.h

#ifndef BST_H
#define BST_H

#include <iostream>
using namespace std;


class BSTNode
{
    public:
        int key;  //关键字
        BSTNode *left;  //左子节点
        BSTNode *right; //右子节点
        BSTNode *parent;  //父节点

        BSTNode(int k = 0, BSTNode *l = NULL, BSTNode *r = NULL, BSTNode *p = NULL) : key(k), left(l), right(r), parent(p) {};  //初始化列表
};


class BSTree
{
    public:
        BSTree();  //构造函数
        ~BSTree();  //析构函数

        void insert(int key);  //将key节点插入到二叉树中

        void PreOrder();  //前序二叉树遍历
        void InOrder();  //中序二叉树遍历
        void PostOrder();  //后序二叉树遍历

        BSTNode *search(int key);  //递归实现,在二叉树中查找key节点
        BSTNode *IteratorSearch(int key);  //迭代实现,在二叉树中查找key节点

        BSTNode *successor(BSTNode *x);  //找节点(x)的后继节点。即,查找"二叉树中数据值大于该节点"的"最小节点"
        BSTNode *predecessor(BSTNode *x);  //找节点(x)的前驱节点。即,查找"二叉树中数据值小于该节点"的"最大节点"

        void remove(int key);  //删除key节点

        void destroy();  //销毁二叉树


    private:
        BSTNode *root;  //根节点
        void PreOrder(BSTNode *tree);  //前序二叉树遍历
        void InOrder(BSTNode *tree);  //中序二叉树遍历
        void PostOrder(BSTNode *tree);  //后序二叉树遍历

        BSTNode *search(BSTNode *x, int key);  //递归实现,在”二叉树x“中查找key节点
        BSTNode *IteratorSearch(BSTNode *x, int key);  //迭代实现,在“二叉树x”中查找key节点

        BSTNode *minimum(BSTNode *tree);  //查找最小节点:返回tree为根节点的二叉树的最小节点
        BSTNode *maximum(BSTNode *tree);  //查找最大节点:返回tree为根节点的二叉树的最大节点

        void insert(BSTNode *&tree, BSTNode *z);  // 将节点(z)插入到二叉树(tree)中

        BSTNode *remove(BSTNode *tree, BSTNode *z);  // 删除二叉树(tree)中的节点(z),并返回被删除的节点

        void destroy(BSTNode *&tree);  //销毁二叉树
};

#endif // BST_H

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *