【数据结构】(二叉树)创建、遍历完全二叉树

在这里插入图片描述

#include < iostream >
#define NUM 100
using namespace std;

// 定义二叉树结点
typedef struct TreeNode{

int data;
struct TreeNode *lchild,*rchild;

}TreeNode, *pTreeNode;

// 递归创建二叉树
pTreeNode createTree(int i, int n)
{

if(i<=n){
	pTreeNode p = new TreeNode;  // 创建头结点
    p->data = i;
	p->lchild = createTree(2*i,n);
	p->rchild = createTree(2*i+1,n);
}
else return NULL;

}

// 定义队列(循环队列)
typedef struct{

pTreeNode elem[NUM];
int front,rear;
int queuesize;  // 队列的容量(也可以省略) 

}sqQueue;

// 创建队列
void initQueue(sqQueue &s)
{

s.front = s.rear = NUM;
s.queuesize = NUM;

}

// 队空
int emptyQueue(sqQueue s)
{

if(s.front == s.rear)
    return 1;
else return 0;

}

// 入队
void enQueue(sqQueue &s, pTreeNode e)
{

if((s.rear+1)%NUM==s.front)  // 队满,返回 
    return;
s.rear = (s.rear+1)%NUM;
s.elem[s.rear] = e;

}

// 出队
void deQueue(sqQueue &s, pTreeNode &e)
{

if(emptyQueue(s))  // 队空,返回 
    return;
s.front = (s.front+1)%NUM;
e = s.elem[s.front];

}

// 队列的方法创建二叉树
pTreeNode createTree2(int i, int n)
{

sqQueue s;  // 创建队列 
initQueue(s);
pTreeNode T = new TreeNode;   // 创建根结点 
T->data = i;
T->lchild = T->rchild = NULL;
enQueue(s,T);  // p结点进栈 
while(!emptyQueue(s)){   // 队列非空(队列为空时结束,表示没有需要连接的根结点) 
	pTreeNode p;   // 不能少!! 否则返回的只有头结点! (这里的 p 和上面的 p 含义不同) 
	deQueue(s,p);  // 把需要连接的根结点 pop 出来 
	int j = p->data;
	if(2 * j<=n){  // 存在左节点 
		pTreeNode pl = new TreeNode;   // 创建根结点(左节点) 
    	pl->data = 2 * j;
    	pl->lchild = pl->rchild =NULL;
    	p->lchild = pl;   // 左节点并入树 
    	enQueue(s,pl);  
	} 
	if(2 * j+1<=n){
		pTreeNode pr = new TreeNode;   // 创建根结点(右结点) 
    	pr->data = 2*j+1;
    	pr->lchild = pr->rchild =NULL;
    	p->rchild = pr; 
    	enQueue(s,pr);
	} 
} 
return T;  // 返回的是整个数的 p 

}

// 先序遍历
void preOrder(pTreeNode pt)
{

if(pt){
	cout<<pt->data<<" ";
	preOrder(pt->lchild);
	preOrder(pt->rchild);
}

}

// 中序遍历
void inOrder(pTreeNode pt)
{

if(pt){
	inOrder(pt->lchild);
	cout<<pt->data<<" ";
	inOrder(pt->rchild);
}

}

// 先序遍历
void postOrder(pTreeNode pt)
{

if(pt){
	postOrder(pt->lchild);
	postOrder(pt->rchild);
	cout<<pt->data<<" ";
}

}

int main()
{

pTreeNode pt = createTree(1,6);  // 递归方法创建树
cout<<"createBTree(1,6)"<<endl;
cout<<"preOrder: ";    //先序遍历
preOrder(pt);   
cout<<endl;
cout<<"inOrder: ";   // 中序遍历 
inOrder(pt);   
cout<<endl;
cout<<"postOrder: ";
postOrder(pt);     // 后序遍历 
cout<<endl;

cout<<endl;
 
pt = createTree2(1,6);    // 队列方法创建树 
cout<<"createBTree2(1,6)"<<endl;
cout<<"preOrder: ";    //先序遍历
preOrder(pt);
cout<<endl;
cout<<"inOrder: ";   // 中序遍历
inOrder(pt);
cout<<endl;
cout<<"postOrder: ";
postOrder(pt);
cout<<endl;   

return 0;

}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值