C语言二叉排序树的创建

        在实际应用中,很多场合会涉及到数据结构中的树,二叉树作为最简单的树,则有很多重要的用处。而二叉树又细分为好多类型,在此只说二叉排序树,这种类型的树有个比较好的特性就是,中序遍历这棵树,你将得到一个按升序排列的数组。下面以一维数组来创建一棵二叉排序树。

     

#include "stdafx.h"
#include <iostream>
#include <vector>

using namespace std;

typedef struct Tree
{
	int Data;
	struct Tree *LeftTree;//左子树
	struct Tree *RightTree;//右子树
}TreeNode, *TreeNodeP;

void InsertNode(TreeNodeP &TreeRoot, int Data)
{
	//新建一个节点
	TreeNodeP NodeP;
	NodeP = (TreeNodeP)malloc(sizeof(TreeNode));
	NodeP->Data = Data;
	NodeP->LeftTree = NodeP->RightTree = NULL;

	//如果树根还没创建,那就把当前新建的节点赋给根吧
	if (TreeRoot == NULL)
	{
		TreeRoot = NodeP;
	}
	//新插入的节点数值比根的小或等,走根的左边
	else if (Data <= TreeRoot->Data)
	{
		//左子树递归结束处
		if (TreeRoot->LeftTree == NULL)
			TreeRoot->LeftTree = NodeP;
		//左递归
		else
			InsertNode(TreeRoot->LeftTree, Data);
	}
	//新插入的节点数值比根的大,走根的右边
	else if (Data > TreeRoot->Data)
	{
		//右子树递归结束处
		if (TreeRoot->RightTree == NULL)
			TreeRoot->RightTree = NodeP;
		//右递归
		else
			InsertNode(TreeRoot->RightTree, Data);
	}
}

void TraveseTreeNode(TreeNodeP TreeRoot, int Mode)
{
	if (TreeRoot)
	{
		//先序遍历
		if (Mode == 1)
		{
			printf("NodeData=%d\n", TreeRoot->Data);
			TraveseTreeNode(TreeRoot->LeftTree, Mode);
			TraveseTreeNode(TreeRoot->RightTree, Mode);
		}
		//中序遍历
		else if (Mode == 2)
		{
			TraveseTreeNode(TreeRoot->LeftTree, Mode);
			printf("NodeData=%d\n", TreeRoot->Data);
			TraveseTreeNode(TreeRoot->RightTree, Mode);
		}
		//后序遍历
		else if (Mode == 3)
		{
			TraveseTreeNode(TreeRoot->LeftTree, Mode);
			TraveseTreeNode(TreeRoot->RightTree, Mode);
			printf("NodeData=%d\n", TreeRoot->Data);
		}
	}
}


int main()
{
	TreeNodeP Tree = NULL;

	int A[11] = { 1, 6, 18, 3, 7, 17, 20, 2, 4, 13, 9 };
	for (int i = 0; i < 11; i++)
	{
		InsertNode(Tree, A[i]);
	}
	TraveseTreeNode(Tree, 2);
	
	return 0;
}

       运行程序,将得到:1 2 3 4 6 7 9 13 17 18 20 。不过二叉排序树有个不好的方面是,每个节点上左右树的深度可能差别比较大,比如有个数组为  1 2 3 4 6 7 9 13 17 18 20,它的树就是1→ 2 →34 6913171820

这棵树根本没左子树啥事。即节点上的左右子树的深度失衡,这个问题将由平衡二叉树来解决。后面有时间写一下。

猜你喜欢

转载自blog.csdn.net/lingyunxianhe/article/details/78086316