我是靠谱客的博主 勤恳大米,最近开发中收集的这篇文章主要介绍二叉排序树的插入,删除和遍历,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

不想再多介绍了,直接上代码吧。

// Tree.cpp: 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include<stdio.h>
#include<stdlib.h>
using namespace std;


typedef int datatype;
#define  rootFlag -1;

typedef struct  node
{
	datatype data;
	node*    leftChild;
	node*   rightChild;
}Node,*Pnode;

//初始化树,生成一个根节点
Pnode InitializeTree() {
	Pnode root=NULL;
	root = (Pnode)malloc(sizeof(Node));
	root->leftChild = NULL;
	root->rightChild = NULL;
	root->data = rootFlag;
	return root;
}

//生成新的节点
Pnode createNode(datatype data) {
	Pnode newNode = NULL;
	newNode = (Pnode)malloc(sizeof(Node));
	newNode->data = data;
	newNode->leftChild = NULL;
	newNode->rightChild = NULL;
	return newNode;
}

//排序二叉树的插入,将新节点插入到排序二叉树中
void InsertNode(Pnode node, Pnode newNode) {
	if(newNode->data>node->data) {
		if (node->rightChild == NULL) {
			node->rightChild = newNode;
		}
		else {
			InsertNode(node->rightChild, newNode);
		}
	}
	if (newNode->data<node->data){
		if (node->leftChild == NULL) {
			node->leftChild = newNode;
		}
		else {
			InsertNode(node->leftChild, newNode);
		}
	}
}

void InsertData(Pnode root, datatype data) {
	Pnode newNode = createNode(data);
	InsertNode(root, newNode);
}

//遍历输出二叉树
void printTreeChild(Pnode node) {
	if (node !=NULL){
		if (node->leftChild != NULL) {
			printf("%d is %d's leftChild.n", node->leftChild->data, node->data);
			printTreeChild(node->leftChild);
		}
		if (node->rightChild != NULL) {
			printf("%d is %d's rightChild.n", node->rightChild->data, node->data);
			printTreeChild(node->rightChild);
		}
	}
}

void printTree(Pnode root) {
	if (root->rightChild == NULL) {
		printf("树为空!n");
	}
	else {
		printf("root value is:%dn", root->rightChild->data);
		printTreeChild(root->rightChild);
	}
}

//删除节点
void deleteNode(Pnode root, datatype deldata) {
	if (root->rightChild == NULL) {
		printf("树为空!n");
	}
	Pnode currentNode = root->rightChild;
	Pnode currentParent = root;
	//找到待删除节点的位置
	bool isLeft = false;
	while (currentNode->data != deldata) {
		currentParent = currentNode;
		if (currentNode->data < deldata) {
			currentNode = currentNode->rightChild;
			isLeft = false;
		}
		else {
			currentNode = currentNode->leftChild;
			isLeft = true;
		}
	}
	//没找到该节点
	if (currentNode == NULL) {
		printf("树中不存在值为%d的节点!n", deldata);
	}
	//找到的话,分三种情况讨论,待删除节点仅仅包含一个子节点,不包含子节点,包含左右两个节点
	if ((currentNode->leftChild == NULL) && (currentNode->rightChild == NULL)) {   //不包含子树
		printf("del:%dn", currentNode->data);
		if (isLeft) currentParent->leftChild = NULL;
		else currentParent->rightChild = NULL;
		free(currentNode);
	}else if (currentNode->leftChild != NULL && currentNode->rightChild != NULL) {      //包含左右节点
		printf("del:%dn", currentNode->data);
		//查找右子树的最小值
		Pnode minNode = currentNode->rightChild;
		Pnode minParent = currentNode;
		while (minNode->leftChild != NULL) {
			minParent = minNode;
			minNode = minNode->leftChild;
		}
		if (minNode == currentNode->rightChild) {            //右子树的最小值就是右子树的根节点
			minNode->leftChild = currentNode->leftChild;
			if (isLeft) currentParent->leftChild = minNode;
			else currentParent->rightChild = minNode;
			free(currentNode);
		}
		else {                                               //右子树的最小值在左分支上
			minParent->leftChild = minNode->rightChild;
			minNode->leftChild = currentNode->leftChild;
			minNode->rightChild = currentNode->rightChild;
			if (isLeft)currentParent->leftChild = minNode;
			else currentParent->rightChild = minNode;
			free(currentNode);
		}
	}else if (currentParent->rightChild != NULL ) {   //仅包含右子树
		printf("del:%dn", currentNode->data);
		if (isLeft) currentParent->leftChild = currentNode->rightChild;
		else currentParent->rightChild = currentNode->rightChild;
		free(currentNode);
	}else{  //仅含有左子树
		printf("del:%dn", currentNode->data);
		if (isLeft) currentParent->leftChild = currentNode->leftChild;
		else currentParent->rightChild = currentNode->leftChild;
		free(currentNode);
	}
}


int main()
{
	int dataArray[11] = { 56,42,45,32,23,36,90,65,80,87,100 };
	Pnode treeRoot = InitializeTree();
	for (int i = 0; i < 11; i++)
	{
		InsertData(treeRoot, dataArray[i]);
	}
	printTree(treeRoot);
	int delvalue;
	while (treeRoot->rightChild) {
		printf("请输入要删除的值:");
		scanf("%d", &delvalue);
		deleteNode(treeRoot, delvalue);
		printTree(treeRoot);
	}
    return 0;
}


最后

以上就是勤恳大米为你收集整理的二叉排序树的插入,删除和遍历的全部内容,希望文章能够帮你解决二叉排序树的插入,删除和遍历所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(34)

评论列表共有 0 条评论

立即
投稿
返回
顶部