二叉树的基本操作

本文就二叉树的基本操作进行总结

包括二叉树的建立、递归遍历、非递归遍历、层序遍历等

二叉树的结构体如下

typedef struct _node
{
	char data;
	struct _node* lchild;
	struct _node* rchild;
}node;

1.二叉树的建立

void create(node*& tree)
{
	char data;
	scanf("%c",&data);
	if ('#'==data)
	{
		tree=NULL;
		return;
	}
	tree=(node*)malloc(sizeof(node));
	tree->data=data;
	printf("输入%c的左节点:",data);
	create(tree->lchild);
	printf("输入%c的右节点:",data);
	create(tree->rchild);
}

2.递归遍历

void preOrder(node* tree)  //先序递归遍历
{
	if(tree)
	{
		printf("%c",tree->data);
		preOrder(tree->lchild);
		preOrder(tree->rchild);
	}
}

void inOrder(node* tree)  //中序递归遍历
{
	if(tree)
	{
		inOrder(tree->lchild);
		printf("%c",tree->data);
		inOrder(tree->rchild);
	}
}

void postOrder(node* tree) //后序递归遍历
{
	if(tree)
	{
		postOrder(tree->lchild);
		postOrder(tree->rchild);
		printf("%c",tree->data);
	}
}

3.非递归遍历

非递归遍历利用队列实现

void preOrder1(node* tree)   //先序非递归遍历
{
	deque<node*> q;
	node* t=tree;
	while (t!=NULL||!q.empty()) 
	{
		while (t!=NULL) 
		{
			printf("%c",t->data);
			q.push_back(t);
			t=t->lchild;
		}
		t=q.back();
		q.pop_back();
		t=t->rchild;
	}
}

void inOrder1(node* tree)  //中序非递归遍历
{
	deque<node*> q;
	node* t=tree;
	while (t!=NULL||!q.empty()) 
	{
		while (t!=NULL) 
		{
			q.push_back(t);
			t=t->lchild;
		}
		t=q.back();
		q.pop_back();
		printf("%c",t->data);
		t=t->rchild;	
	}
}

void postOrder1(node* tree)  //后序非递归遍历
{
	deque<node*> q;
	node* t=tree;
	node* prerchild=NULL;
	while (t!=NULL||!q.empty()) 
	{
		while (t!=NULL) 
		{
			q.push_back(t);
			t=t->lchild;
		}
		t=q.back();
		if (t->rchild==NULL||t->rchild==prerchild) 
		{
			q.pop_back();
			printf("%c",t->data);
			prerchild=t;
			t=NULL;
		}
		else
		{
			t=t->rchild;
		}
	}
}

4.层序遍历

层序遍历也是借助队列实现的

void levelOrder(node* tree)
{
	deque <node*> q;
	if (!tree) return;
	node* t=tree;
	q.push_back(t);
	while (!q.empty()) 
	{
		t=q.front();
		q.pop_front();
		printf("%c",t->data);
		if (t->lchild) q.push_back(t->lchild);
		if (t->rchild) q.push_back(t->rchild);
	}
}

层序遍历有时候,还需要将不同层之间分层输出,实现如下

void levelOrder1(node* tree)
{
	deque<node*> q;
	if (NULL==tree) return; 
	node* t=tree;
	q.push_back(t);
	int levelNum=1;
	while(!q.empty())
	{
		levelNum=q.size();
		for (int i=0;i<levelNum;i++) 
		{
			t=q.front();
			q.pop_front();
			printf("%c",t->data);
			if (t->lchild!=NULL) 
			{
				q.push_back(t->lchild);			
			}
			if (t->rchild!=NULL) 
			{
				q.push_back(t->rchild);
			}
		}
		printf("\n");
	}
}


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
叉树是一种非常重要的数据结构,它的基本操作包括创建、销毁、遍历、查找等。下面是二叉树基本操作的实现方法: 1. 创建二叉树:通过前序遍历的数组构建二叉树,其中 '#' 表示空节点。具体实现方法可以参考引用中的 BinaryTreeCreate 函数。 2. 销毁二叉树:遍历二叉树,依次释放每个节点的内存空间。具体实现方法可以参考引用中的 BinaryTreeDestory 函数。 3. 遍历二叉树:二叉树的遍历包括前序遍历、中序遍历、后序遍历和层序遍历。具体实现方法可以参考引用中的 BinaryTreePrevOrder、BinaryTreeInOrder、BinaryTreePostOrder 和 BinaryTreeLevelOrder 函数。 4. 查找二叉树节点:在二叉树中查找值为 x 的节点,具体实现方法可以参考引用中的 BinaryTreeFind 函数。 5. 计算二叉树节点个数:计算二叉树中节点的个数,具体实现方法可以参考引用[2]中的 BinaryTreeSize 函数。 6. 计算二叉树叶子节点个数:计算二叉树中叶子节点的个数,具体实现方法可以参考引用中的 BinaryTreeLeafSize 函数。 7. 计算二叉树第 k 层节点个数:计算二叉树中第 k 层节点的个数,具体实现方法可以参考引用中的 BinaryTreeLevelKSize 函数。 8. 判断二叉树是否是完全二叉树:判断二叉树是否是完全二叉树,具体实现方法可以参考引用中的 BinaryTreeComplete 函数。 9. 计算二叉树的深度:计算二叉树的深度,具体实现方法可以参考引用中的 BinaryTreeDeep 函数。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值