c_cpp 二叉搜索树的相关操作(创建,插入节点,前,中,后序递归和非递归遍历二叉树)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c_cpp 二叉搜索树的相关操作(创建,插入节点,前,中,后序递归和非递归遍历二叉树)相关的知识,希望对你有一定的参考价值。

/*
 * Description:
 *           二叉搜索树的相关操作(创建,插入节点,前、中、后序递归和非递归遍历二叉树)
 * Author  :FinL
 * Language: C
 * Date    : 2010-08-29
 * 网址:http://blog.chinaunix.net/uid-20775243-id-2554952.html
 */

#include<stdio.h>
#include<stdlib.h>

typedef struct Node{
    int data;
	Node *leftchild;
	Node *rightchild;
}Node;


/*
 初始化一棵二叉树排序树。
*/
void InitBinaryTree(Node**root,int elem)
{
	*root=(Node*)malloc(sizeof(Node));
	if(!(*root))
	{
		printf("Memory allocation for root failed.\n");
		return;
	}
	(*root)->data=elem;
	(*root)->leftchild=NULL;
	(*root)->rightchild=NULL;
}

/*
 向二叉树排序树中插入结点。
*/
void InsertNode(Node *root,int elem)
{
	Node *newnode=NULL;
	Node *p=root,*last_p=NULL;

	newnode=(Node*)malloc(sizeof(Node));
	if(!newnode)
	{
		printf("Memory allocation for newnode failed.\n");
		return;
	}
	newnode->data=elem;
	newnode->leftchild=NULL;
	newnode->rightchild=NULL;

	while(NULL!=p)
	{
		last_p=p;
		if(newnode->data<p->data)
		{
			p=p->leftchild;
		}
		else if(newnode->data>p->data)
		{
			p=p->rightchild;
		}
		else
		{
			printf("Node to be inserted has existed.\n");
			free(newnode);
			return;
		}
	}
	p=last_p;
	if(newnode->data<p->data)
	{
		p->leftchild=newnode;
	}
	else
	{
		p->rightchild=newnode;
	}
}

/*
 创建一棵二叉树排序树。
*/
void CreatBinarySearchTree(Node **root,int data[],int num)
{
	int i;

	for(i=0;i<num;i++)
	{
		if(NULL==*root)
		{
			InitBinaryTree(root,data[i]);
		}
		else
		{
			InsertNode(*root,data[i]);
		}
	}
}


/*
 前序遍历二叉树,递归方法。
*/
void PreOrderRec(Node *root)
{
	if(NULL!=root)
	{
		printf("%d  ",root->data);
		PreOrderRec(root->leftchild);
		PreOrderRec(root->rightchild);
	}
}


/*
 前序遍历二叉树,非递归方法。
*/
void PreOrderNoRec(Node *root)
{
	Node *p=root;
	Node *stack[30];
	int num=0;
	while(NULL!=p||num>0)
	{
		while(NULL!=p)
		{
			printf("%d  ",p->data);
			stack[num++]=p;
			p=p->leftchild;
		}
		num--;
		p=stack[num];
		p=p->rightchild;
	}
	printf("\n");
}


/*
 中序遍历二叉树,递归方法。
*/
void InOrderRec(Node *root)
{
	if(NULL!=root)
	{
		InOrderRec(root->leftchild);
		printf("%d  ",root->data);
		InOrderRec(root->rightchild);
	}
}

/*
 中序遍历二叉树,非递归方法,使用栈。
*/
void InOrderNoRec(Node *root)
{
	Node *p=root;
	int num=0;
	Node *stack[30];
	while(NULL!=p||num>0)
	{
		while(NULL!=p)
		{
			stack[num++]=p;
			p=p->leftchild;
		}
		num--;
		p=stack[num];
		printf("%d  ",p->data);
		p=p->rightchild;
	}
	printf("\n");
}

/*
 后序遍历二叉树,递归方法。
*/
void PostOrderRec(Node *root)
{
	if(NULL!=root)
	{
		PostOrderRec(root->leftchild);
		PostOrderRec(root->rightchild);
		printf("%d  ",root->data);
	}
}

/*
 后序遍历二叉树,非递归方法。
*/
void PostOrderNoRec(Node *root)
{
	Node *p=root;
	Node *stack[30];
	int num=0;
	Node *have_visited=NULL;

	while(NULL!=p||num>0)
	{
		while(NULL!=p)
		{
			stack[num++]=p;
			p=p->leftchild;		
		}
		p=stack[num-1];
		if(NULL==p->rightchild||have_visited==p->rightchild)
		{
			printf("%d  ",p->data);
			num--;
			have_visited=p;
			p=NULL;
		}
		else
		{
			p=p->rightchild;
		}
	}
	printf("\n");
}

以上是关于c_cpp 二叉搜索树的相关操作(创建,插入节点,前,中,后序递归和非递归遍历二叉树)的主要内容,如果未能解决你的问题,请参考以下文章

数据结构之二叉搜索树详解

数据结构--Avl树的创建,插入的递归版本和非递归版本,删除等操作

LeetCode Java刷题笔记—701. 二叉搜索树中的插入操作

19. 二叉搜索树的插入删除修剪

平衡二叉树的构建

二叉搜索树的建立查找删除等相关操作实现及对于删除操作的详细解释