二叉树的创建和遍历(中序 先序 后序)

二叉树:不仅要存放数据,而且要存放数据与数据之间关系的一种数据结构。

1、每个点都只能最多有两棵子树,即二叉树不存在度大于2的节点

2、二叉树的子树有左右之分,其子树的次序不能颠倒

二叉树的性质

1、 在二叉树的第i层上至多有2^(i-1)个结点

2、深度为k的二叉树至多有2^(k)-1结点

3、对任何一棵二叉树T,如果其终端节点数为n0,度为2的节点数为n2,则n0=n2+1

4、具有n个结点的完全二叉树深度为log2n+1

二叉树是一种特殊的树,由于它的特殊性,使得用顺序存储结构也可以实现。

二叉树的顺序存储结构就是用一维数组存储二叉树中的节点,并且节点的位置,也就是数组的下标要能体现节点之间的逻辑关系,比如双亲与孩子的关系,左右兄弟的关系等。

由于一般二叉树必须仿照完全二叉树那样存储,可能会浪费很多存储空间,单支树就是一个极端情况。顺序存储结构一般只用于完全二叉树

既然顺序存储适用性不强,我们就要考虑链式存储结构

链表表示:

typedef int TElemtype;//二叉树的二叉链表节点结构定义
typedef struct BiTNode//节点结构
{
	TElemtype data;//节点数据
	struct BiTNode *lchild,*rchild;//左右孩子指针

}BiTNode,*BiTree;

二叉树的遍历(Binary Tree Traversal)

所谓树的遍历,就是按照某种次序访问树中的结点,要求每个结点访问仅且访问一次

设访问根节点记作V

遍历根的左子树记作L

遍历根的右子树记作R

前序 V L R       中序 L V R        后序 L R V

中序遍历二叉树算法的框架是:

       若二叉树为空则空操作

       否则:中序遍历左子树(L)

                  访问根节点(V)

                  中序遍历右子树(R)

中序:C B E D F A G H     先序:A B C D E F G H     后序:C E F D B H G A

#include<iostream>
using namespace std;

typedef char ElemType;
typedef struct BtNode//二叉树结点
{
	BtNode *leftchild;
	BtNode *rightchild;
	ElemType data;
}BtNode,*BinaryTree;

BtNode *Buynode()//购买结点
{
	BtNode *s=(BtNode*)malloc(sizeof(BtNode));
	if(NULL==s)
	{
		exit(1);
	}
	memset(s,0,sizeof(BtNode));
	return s;
}
void Freenode(BtNode *p)
{
	free(p);
}
void InOrder(BtNode *p)//中序遍历
{
	if(p!=NULL)
	{
		
		InOrder(p->leftchild);
		cout<<p->data<<" ";
		InOrder(p->rightchild);
	}
}
void PreOrder(BtNode *p)//先序遍历
{
	if(p!=NULL)
	{
		cout<<p->data<<" ";
		PreOrder(p->leftchild);		
		PreOrder(p->rightchild);
	}
}
void PastOrder(BtNode *p)//后序遍历
{
	if(p!=NULL)
	{
		PastOrder(p->leftchild);		
		PastOrder(p->rightchild);
		cout<<p->data<<" ";
	}
}
BtNode *CreatTree1()//先序遍历的方式创建一棵二叉树
{
	BtNode *s=NULL;
	ElemType item;
	cin>>item;
	if(item!='#')
	{
		s=Buynode();
		s->data=item;
		s->leftchild=CreatTree1();
		s->rightchild=CreatTree1();

	}
	return s;
}
BtNode *CreatTree2(ElemType *&str)//这里不能使用*str
{
	BtNode *s=NULL;
	if(str!=NULL && *str != '#')
	{
		s=Buynode();
		s->data=*str;
		s->leftchild=CreatTree2(++str);
		s->rightchild=CreatTree2(++str);
	}
	return s;
}
void CreatTree3(BtNode*&p,ElemType *&str)
{
	if(NULL==str||*str=='#')
	{
		p=NULL;
	}
	else
	{
		p=Buynode();
		p->data=*str;
		CreatTree3(p->leftchild,++str);
		CreatTree3(p->rightchild,++str);
	}
}
int main()
{
	BinaryTree root =NULL;
	//root=CreatTree1();
	
	
	char *str="ABC##DE##F##G#H##";	
	//root=CreatTree2(str);
	CreatTree3(root,str);
	PreOrder(root);
	cout<<endl;
	InOrder(root);
	cout<<endl;
	PastOrder(root);
	cout<<endl;
	return 0;
}

 

 

  • 3
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值