二叉树是一种非线性数据结构,本文实现的是二叉树的三种遍历方法,以及一种二叉搜索树,即左孩子节点的值小于根节点的值小于右孩子节点的值

对二叉树不了解的需要先了解二叉树,本文说的比较简练实用

  • 二叉树的结构,二叉树的链式结构非常简单,即一个数据节点,加上两个孩子节点。
typedef struct BitNode
{
	int data;
	struct BitNode *left_child,*right_child;

}BitNode,*BitNode_ptr;

二叉树的遍历

二叉树的遍历方法总结起来一共分为三步:

  • 按照顺序访问节点,前序,中序,后序,分别对应
    1 从根节点到左右孩子
    2 左孩子到根节点再到右节点
    3 左右孩子节点再到根节点
  • 有孩子节点的优先遍历孩子节点
  • 访问到根节点就输出数据

    把握住这三步,对于二叉树的遍历基本没有问题,对于前中后序遍历步骤不用记,前就是从上到下,后就是从下到上,中就是下到上再到下

/* 前序遍历 */
/* 根->左->右 */
void preOrder(BitNode_ptr T)
{
	if(T == NULL)
		return;
	printf("%d ",T->data);  	// 访问根节点
	preOrder(T->left_child); 	// 访问左节点
	preOrder(T->right_child);	// 访问右节点
}

/* 中序遍历 */
/* 左->根->右 */
void InOrder(BitNode_ptr T)
{
	if(T == NULL)
		return;
	InOrder(T->left_child);	   /* 访问左节点 */
	/* 一直遍历到最后的左节点才开始返回打印数据 */
	printf("%d ",T->data);	   /* 访问根节点 */
	InOrder(T->right_child);   /* 访问右节点 */
}

/* 后序遍历 */
/* 左->右->根  / 右->左->根 */
void PostOrder(BitNode_ptr T)
{
	if(T == NULL)
		return;
	PostOrder(T->left_child);  	/* 访问左节点 */
	PostOrder(T->right_child);    /* 访问右节点 */
	printf("%d ",T->data);	    /* 访问根节点 */
}

二叉搜索树

对于二叉树的掌握需要对递归有一定的理解

/* 1 创建一个二叉树节点 */
BitNode_ptr create_bitnode(int data)
{
	BitNode_ptr t = malloc(sizeof(struct BitNode));
	t->left_child = NULL;
	t->right_child = NULL;
	t->data = data;
}

/* 2 将二叉树节点插入到二叉树中(以二叉搜索树的方式) */
void add_bitree(BitNode_ptr T,BitNode_ptr t)
{
	if(T == NULL)  	//	 根节点
	{
		T = t;
		return;
	}
	if(t->data < T->data)	// 小于 放在左节点,有孩子节点先判断孩子节点
	{
		if(T->left_child != NULL)
			add_bitree(T->left_child,t);	
		else
			T->left_child = t;
	}
	else  					// 大于等于  放在右节点,有孩子节点先判断孩子节点
	{
		if(T->right_child != NULL)
			add_bitree(T->right_child,t);
		else 
			T->right_child = t;
	}
}

/* 返回二叉树的深度 */
int bit_tree_depth(BitNode_ptr T)
{
	static int depth = 0;
	int left_depth = 0,right_depth = 0;
	
	if(T == NULL)
		return 0;
	
	left_depth  = bit_tree_depth(T->left_child);
	right_depth = bit_tree_depth(T->right_child);
	
	depth = right_depth>left_depth ? right_depth : left_depth;
	
	return depth + 1;
}

测试程序

void main()
{
	
/* 创建根节点 */	
	T = create_bitnode(10);
	BitNode_ptr t;
	
/* 创建各个节点 */	
	t = create_bitnode(9);
	add_bitree(T,t);
	
    t = create_bitnode(20);
	add_bitree(T,t);
	
	t = create_bitnode(15);
	add_bitree(T,t);
	
	t = create_bitnode(35);
	add_bitree(T,t);

/* 三种遍历方式 */	
	preOrder(T);		
	printf("\n");
	InOrder(T);
	printf("\n");
	PostOrder(T);
	printf("\n");
	
/* 返回二叉树的深度 */	
    printf("depth is %d\r\n ",bit_tree_depth(T));
}

还有一些高级的二叉树,如二叉平衡树,红黑树等,如果需要掌握这些高级的数据结构,还是要下一定的功夫的。


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!

数据结构-队列 上一篇
数据结构-栈 下一篇