链式二叉树

      前面已经展示过一些二叉树的基本概念,接下来基于链表的存储结构实现一个链式二叉树。
      此处是通过递归的方法创建。

//链式存储方式--孩子表示法
typedef char Datatype;
typedef struct BTnode {
	struct BTnode* Left;
	struct BTnode* Right;
	Datatype data;
}BTnode;
//创建节点
BTnode* CreatNewNode(Datatype data) {
	BTnode* NewNode = (BTnode *)malloc(sizeof(BTnode));
	if (NewNode == NULL) {
		return;
	}
	NewNode->data = data;
	NewNode->Right = NULL;
	NewNode->Left = NULL;
	return NewNode;
}
//创建树-有索引(用户不需要知道index,这个参数,在外面再加一层“外壳”)
BTnode* InCreatBinaryTree(Datatype* array, int size,int* index, Datatype invalid) {
	BTnode* Root = NULL;
	if (*index < size && array[*index]!=invalid) {
		//创建根
		Root = CreatNewNode(array[*index]);
		//创建左子树
		++(*index);
		Root->Left = InCreatBinaryTree(array, size, index,invalid);
		//创建右子树
		++(*index);
		Root->Right = InCreatBinaryTree(array, size, index, invalid);
	}
	return Root;
}
//创建树-封装InCreatBinaryTree()函数
//创建时array的输入(没有节点的地方输入非字母字符):char* str = "abd###ce##f";
BTnode* CreatBinaryTree(Datatype* array, int size,Datatype invalid) {
	int index = 0;
	return InCreatBinaryTree(array, size, &index, invalid);
}

以下是二叉树的基本操作

// 二叉树的销毁 
void DestroyBinTree(BTnode** root) {
	if (root) {
		DestroyBinTree((*root)->Left);
		DestroyBinTree((*root)->Right);
		free(*root);
		*root = NULL;
	}
}
//前序遍历
void PreOrder(BTnode* root) {
	if (root) {
		printf("%c ",root->data);
		PreOrder(root->Left);
		PreOrder(root->Right);
	}
}
// 中序遍历 
void InOrder(BTnode* root) {
	if (root) {
		InOrder(root->Left);
		printf("%c ", root->data);
		InOrder(root->Right);
	}
}
// 后序遍历 
void PostOrder(BTnode* root) {
	if (root) {
		PostOrder(root->Left);
		PostOrder(root->Right);
		printf("%c ", root->data);
	}
}
// 层序遍历 
void LevelOrder(BTnode* root) {
	Queue q;
	if (root==NULL) {
		return NULL;
	}
	QueueInit(&q);
	QueuePush(&q, root);
	while (QueueEmpty(&q)!=1) {     //QueueEmpty函数,空返回1,不空返回0
		BTnode* tmp = QueueFront(&q);
		printf("%c ", tmp->data);
		if (tmp->Left!= NULL) {
			QueuePush(&q, tmp->Left);
		}
		if (tmp->Right!= NULL) {
			QueuePush(&q, tmp->Right);
		}
		QueuePop(&q);
	}
	printf("\n");
}
// 获取二叉树中节点个数
int GetBinTreeSize(BTnode* root) {
	if (root==NULL) {
		return 0;
	}
	return GetBinTreeSize(root->Left) + GetBinTreeSize(root->Right) + 1;
}
// 获取二叉树中第K层节点个数 
int GetKLevelNodeCount(BTnode* root, int K) {
	if (root == NULL||K<=0) {
		return 0;
	}
	if (K == 1) {
		return 1;
	}
	return GetKLevelNodeCount(root->Left, K - 1) + GetKLevelNodeCount(root->Right, K - 1);
}

// 获取二叉树中叶子节点个数 
int GetLeafCount(BTnode* root) {
	if (root == NULL) {
		return 0;
	}
	if (root->Left == NULL && root->Right == NULL) {
		return 1;
	}
	return GetLeafCount(root->Left) + GetLeafCount(root->Right);
}
// 获取二叉树深度(高度) 
int GetBinTreeHeight(BTnode* root) {
	if (root == NULL) {
		return 0;
	}
	int lefthight = GetBinTreeHeight(root->Left);
	int righthight = GetBinTreeHeight(root->Right);
	return lefthight >= righthight ? lefthight + 1:righthight + 1;
}
// 检测值为x的元素是否在二叉树中,在返回该节点的地址,否NULL 
BTnode* BinaryTreeFind(BTnode* root, Datatype x) {
	if (root == NULL) {
		return NULL;
	}
	if (root->data == x) {
		return root;
	}
	BTnode* node = NULL;
	if (node = BinaryTreeFind(root->Left,x)) {
		return node;
	}
	return BinaryTreeFind(root->Right,x);
}
// 二叉树的镜像 
void Mirror(BTnode* root) {
	if (root) {
		Swap(&root->Left, &root->Right);
		Mirror(root->Left);
		Mirror(root->Right);
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值