数据结构篇——二叉树

       学习数据结构,显而易见树是重要的一个组成部分,而二叉树则是在树这种数据结构中应用较广的类型,二叉树的每个节点最多有两棵子树,且有左右之分,这个概念要和度为2的树区分开!

数据结构篇——二叉树_第1张图片

        首先当让是定义二叉树的结构体,可以是顺序存储的结构,也可以是链式存储的结构,由于顺序存储只适用于完全二叉树(因为不管是不是完全二叉树,它都按照完全二叉树的层数来获取内存空间——n层的二叉树就需要2^{n-1}个存储空间,因此存在大量内存浪费),这里采取的是链式存储的方式。

typedef char ElementType;
typedef struct Node
{
    ElementType data;
    struct Node *lchild;
    struct Node *rchild;
}BTNode,*BTree;

       一般情况下,我们会通过广义表来创建一棵二叉树,广义表:A(B(D,),C(E,F(,H)))

BTree createTree(char s[]){
	BTree T[1000], BT;
	int i = 1, k = 0; // k=1表示左孩子k=2表示右孩子 
	for (int j=0; s[j]!='\0'; j++){
		if (isalpha(s[j])){
			BT = (BTree)malloc(sizeof(BTree));
			BT->data = s[j];
			BT->lchild = NULL;
			BT->rchild = NULL;
			switch (k){
				case 0:
					T[i] = BT;
					break;
				case 1:
					T[i] = BT;
					T[i/2]->lchild = T[i];
					break;
				case 2:
					T[i] = BT;
					T[(i-1)/2]->rchild = T[i];
					break;
			}
		}
		switch (s[j]){
			case '(':
				k = 1;
				i *= 2;
				break;
			case ',':
				k = 2;
				i += 1;
				break;
			case ')':
				i = (i - 1) / 2;
				break;
		}
	}
	return T[i];
}

       也可以在加入字符串的首位位置来递归创建。

BTree createTree(char s[], int left, int right){
	BTree bt = (BTree)malloc(sizeof(BTree));
	bt->data = NULL;
	bt->lchild = NULL;
	bt->rchild = NULL;
	int i = left - 1;
	int k = 0;        // k=1表示左孩子,k=2表示右孩子 
	int layer = 0;    // layer表示进入的层数,如果小于等于1表示当前位置在处理自己的子树,如果大于1则表示当前位置为子树的子树不做处理 
	while (++i <= right){
		if (isalpha(s[i]) && layer <= 1){
			if (k == 1)
				bt->lchild = createTree(s, i, right);
			else if (k == 2)
				bt->rchild = createTree(s, i, right);
			else bt->data = s[i];
		}
		switch(s[i]){
			case '(':
				k = 1;
				layer++;
				break;
			case ',':
				k = 2;
				break;
			case ')':
				k = 2;   // 表示右子树处理结束(因为右子树可能没有孩子,因此要设置标志) 
				layer--;
				break;
		}
		if (k != 0 && layer <= 0)  // 没有子树的右孩子会遇到‘)’而使layer的值变为-1 
			return bt;
	}
	return bt;
}

       在使用一种结构体的时候,最重要的无非就是创建以及读取,对二叉树的读取,我们有四种方式,分别是:先序遍历、中序遍历、后序遍历和层序遍历、这里再看一下上面的那张二叉树的图,我们来分别介绍这四种遍历方式。

数据结构篇——二叉树_第2张图片

对于这棵二叉树来说,先序遍历得到的结果就是:ABDECFG

你可能感兴趣的:(数据结构,c语言)