1. 程式人生 > >C語言二叉排序樹的建立

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

這棵樹根本沒左子樹啥事。即節點上的左右子樹的深度失衡,這個問題將由平衡二叉樹來解決。後面有時間寫一下。