二叉树 - 先序创建一棵二叉树(C++)

二叉树的定义:二叉树由节点的有限集合构成,这个有限集合或者为空集,或者为由一个根节点(root)及两棵互不相交、分别称作这个根的左子树(left subtree)和右子树(right subtree)的二叉树组成的集合。

 
按照先序序列输入的数据构建一棵由先序方式构建的二叉树:代码如下
 
/* 先序创建一棵任意二叉树 */
/* 注意:输入数据的顺序很有特点,本题输入的顺序要求为,先是根节点,再是左子树,再是右子树 */

#include <iostream>
#include <malloc.h>
using namespace std;

typedef int ElementType;             //给int起别名为ElementType, typedef是起别名的意思 
typedef struct bitnode              //定义二叉树节点数据类型 
{
	ElementType data;
	struct bitnode *left, *right;
} bitnode, *bitree;           //bitree为指向bitnode这种结构的指针


bitree PerCreateTree(bitree T);           //先序创建一棵二叉树

void PerOrder(bitree T);          //先序输出一棵二叉树

bitree FreeTree(bitree T);       //释放空间
 


//先序创建一棵二叉树 
bitree PerCreateTree()
{
	bitree T; 
	ElementType item;
	cin >> item;
	if( item == 0 )              //叶节点数据标志:其后根两个0 
	    T = NULL;            //若某一节点为叶子结点,则其左右子树均为NULL,0表示建空树
	else
	{
		T = (bitree)malloc(sizeof(bitnode));
		T->data = item;
		
		T->left = PerCreateTree();             //递归创建其左子树 
		T->right = PerCreateTree();            //递归创建其右子树 
	} 
	
	return T;                              //返回根节点 
}

//先序递归周游二叉树
void PerOrder(bitree T)
{
	if( T )            // T != NULL 
	{
		cout << T->data << " ";
		PerOrder(T->left);            //递归先序周游其左子树 
		PerOrder(T->right);           //递归先序周游其右子树 
	}
} 

//释放空间
bitree FreeTree(bitree T)
{
	if( T )
	{
		FreeTree(T->left);            //递归释放其左子树 
		FreeTree(T->right);           //递归释放其右子树 
		
		free(T);                      //释放根节点 
		T = NULL;                     //释放指向根节点的指针 
	}
	
	return T;           //返回释放后的根节点NULL 
} 

int main()
{
	bitree root;
	
	cout << "请输入数据先序创建一棵二叉树:";
	root = PerCreateTree();               //先序创建一棵二叉树 
	
	cout << "先序周游的结果:"; 
	PerOrder(root);             //先序周游 
	cout << endl;
	
	return 0;
}


输入及输出:

 

 

后记:

 

最近在看一本书,是红衣教主周鸿祎写的《我的互联网方法论》,他讲到了互联网的本质——Free,没错,就是免费,Internet这条信息高速公路不仅仅需要哪些专业人士去建造,而且需要我们每一个人来贡献出一些东西,我们需要站在巨人的肩膀上去眺望未来,编程也是这样,不要刀耕火种,我们需要交流,相互交流,这也是我为什么要花我的一部分时间来写博客的原因,我所写的这些东西也许都是上个世纪的产物了,很多人都在写,但是我希望我们每个人都来写,因为分享知识从来都是一件令人快乐的事。

 

 

 

 

 

             

  • 43
    点赞
  • 159
    收藏
    觉得还不错? 一键收藏
  • 11
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值