二叉树的基础操作

BinTree.h

#ifndef _BINTREE_H_
#pragma once 

#include<stdio.h>
#include<assert.h>
#include<malloc.h>
#include<windows.h>

typedef int BTDataType; 

//typedef struct TreeNode 
//{ 
// BTDataType _data; 
// struct TreeNode* _firstChild; 
// struct TreeNode* _nextBrother; 
//}TreeNode; 

typedef struct BinaryTreeNode 
{ 
	struct BinaryTreeNode* _left; 
	struct BinaryTreeNode* _right; 
	BTDataType _data; 
}BTNode; 
#include "Queue.h" 
//#include "Stack.h" 

BTNode* BuyBTNode(BTDataType x) ;
// 创建二叉树 
BTNode* CreateBTree(BTDataType* a, size_t* pIndex, BTDataType invalid) ;
void BTreePrevOrder(BTNode* root) ;
void BTreeInOrder(BTNode* root) ;
void BTreePostOrder(BTNode* root) ;

size_t BTreeSize(BTNode* root) ;
size_t BTreeLeafSize(BTNode* root) ;
size_t BTreeKLevelSize(BTNode* root, size_t k) ;
size_t BTreeDepth(BTNode* root) ;
BTNode* BTreeFind(BTNode* root, BTDataType x) ;
void BTreeLevelOrder(BTNode* root) ;
// 判断完全二叉树 
int IsCompleteBTree(BTNode* root) ;
int IsCompleteBTree1(BTNode* root) ;// flag的方式判断 
// 非递归遍历 
void BTreePrevOrderNonR(BTNode* root) ;
void BTreeInOrderNonR(BTNode* root) ;
void BTreePostOrderNonR(BTNode* root) ;

void TestBinaryTree() ;

#endif // !_BINTREE_H_

BinTree.c

#include"BinTree.h"

BTNode* BuyBTNode(BTDataType x){
	BTNode *node=(BTNode *)malloc(sizeof(BTNode));
	node->_data=x;
	node->_left=NULL;
	node->_right=NULL;
	return node;
}

BTNode* CreateBTree(BTDataType* a, size_t* pIndex, BTDataType invalid){
	BTNode *root=NULL;
	if(a[*pIndex]!=invalid){
		root = BuyBTNode(a[*pIndex]);
		(*pIndex)++;
		root->_left = CreateBTree( a, pIndex, invalid);
		(*pIndex)++;
		root->_right = CreateBTree( a, pIndex, invalid);
	}
	return root;
}
void BTreePrevOrder(BTNode* root){
	if(root==NULL)
		return;

	printf("%d ",root->_data);
	BTreePrevOrder(root->_left);
	BTreePrevOrder(root->_right);
}

void BTreeInOrder(BTNode* root) {
	if(root==NULL)
		return;
	BTreeInOrder(root->_left);
	printf("%d ",root->_data);
	BTreeInOrder(root->_right);
}

void BTreePostOrder(BTNode* root) {
	if(root==NULL)
		return;
	BTreeInOrder(root->_left);
	BTreeInOrder(root->_right);
	printf("%d ",root->_data);
}

size_t BTreeSize(BTNode* root) {
	if(root==NULL)
		return 0;
	return BTreeSize(root->_left)+BTreeSize(root->_right)+1;
}

size_t BTreeLeafSize(BTNode* root) {
	if(root==NULL)
		return 0;
	if(root->_left==NULL&&root->_right==NULL)
		return 1;
	return BTreeLeafSize(root->_left)+BTreeLeafSize(root->_right);
}

size_t BTreeKLevelSize(BTNode* root, size_t k){
	if(root==NULL)
		return 0;
	if(k==1)
		return 1;
	return BTreeKLevelSize(root->_left, k-1)+
		BTreeKLevelSize(root->_right,k-1);
}

size_t BTreeDepth(BTNode* root){
	if(root==NULL)
		return 0;
	return BTreeDepth(root->_left)+1;
}

BTNode* BTreeFind(BTNode* root, BTDataType x) {
	BTNode* leftNode, *rightNode;
	if(root==NULL)
		return NULL;
	if(root->_data==x)
		return root;
	leftNode=BTreeFind(root->_left,x);
	if(leftNode)
		return leftNode;
	rightNode=BTreeFind(root->_right,x);
	if(rightNode)
		return rightNode;
}

void BTreeLevelOrder(BTNode* root){  //层序遍历
	Queue q;
	QueueInit(&q);
	QueuePush(&q,root);
	while(QueueEmpty(&q)){
		BTNode* cur=QueueFront(&q);
		printf("%d ",cur->_data);
		if(cur->_left)
			QueuePush(&q,cur->_left);
		if(cur->_right)
			QueuePush(&q,cur->_right);
		QueuePop(&q);
	}
	printf("\n");
}

int IsCompleteBTree(BTNode* root) {
	Queue q;
	QueueInit(&q);
	QueuePush(&q,root);
	while(QueueEmpty(&q)){
		BTNode* cur=QueueFront(&q);
		if(cur==NULL){
			break;
		}
		else{
			QueuePush(&q,cur->_left);
			QueuePush(&q,cur->_right);
		}
		QueuePop(&q);
	}
	while(QueueEmpty(&q)){
		BTNode* cur=QueueFront(&q);
		if(cur!=NULL)
			return 0;
		QueuePop(&q);
	}
	return 1;
}

int IsCompleteBTree1(BTNode* root) ;// flag的方式判断 
// 非递归遍历 
void BTreePrevOrderNonR(BTNode* root) ;
void BTreeInOrderNonR(BTNode* root) ;
void BTreePostOrderNonR(BTNode* root) ;


void TestBinaryTree() 
{ 
	int a[] = {1, 2, 3, '#', '#',4,'#', '#', 5, 6,'#' ,'#' ,'#' }; 
	size_t index = 0; 
	BTNode* tree = CreateBTree(a, &index, '#'); 
	BTreePrevOrder(tree); 
	printf("\n"); 
	//BTreePrevOrderNonR(tree); 
	BTreeInOrder(tree); 
	printf("\n"); 
	BTreePostOrder(tree); 
	printf("\n"); 

	printf("BTreeSize?       %d\n", BTreeSize(tree)); 
	printf("BTreeLeafSize?   %d\n", BTreeLeafSize(tree)); 
	printf("BTreeKLevelSize? %d\n", BTreeKLevelSize(tree, 2)); 
	printf("BTreeDepth?      %d\n", BTreeDepth(tree)); 
	printf("Find:            %d\n",BTreeFind(tree,5)->_data);
	BTreeLevelOrder(tree);
	printf("IsCompleteBTree? %d\n", IsCompleteBTree(tree)); 

} 

posted @ 2018-02-25 17:25  VictorChang  阅读(111)  评论(0编辑  收藏  举报