二叉树的基础操作

1:抽象数据类型定义

typedef struct BiTNode
{
	char data;
	struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;

2:先序创建二叉树

核心思想:利用递归,输入ch,#代表空节点。

void CreateBitree(BiTree &T)
{
	char ch;
	scanf("%c",&ch);
	if(ch=='#')
	T = NULL;
	else
	{
		T = (BiTNode *)malloc(sizeof(BiTNode));
		T->data = ch;
		CreateBitree(T->lchild);
		CreateBitree(T->rchild);
	}
	return OK;
}

3:先序递归遍历二叉树

核心思想:如果T不为空,则先打印出节点元素,再进行递归左子树,右子树。

void PreOrderTra(BiTree *T)
{
	if(T)
	{
		printf("%c",T->data);
		PreOrderTra(T->lchild);
		PreOrderTra(T->rchild);
	}
}

中序和后序递归遍历算法思想与先序相同,只需要调换了printf位置既可。

4:先序,中序非递归遍历二叉树

核心思想:转载请注明出处:(39条消息) 二叉树的非递归前序、中序、后序遍历算法详解及代码实现(C语言)_Benja_K的博客-CSDN博客_二叉树的先序,中序,后序遍历c语言

遍历过程:

入栈时访问节点内容,则为前序遍历;出栈时访问,则为中序遍历。

利于理解的伪代码:


void preOrder(BiTree *T){
    p = T
    while(p不空||栈不空){
        if(p不空){      //两种情况:1.栈不空;2.栈空
            p入栈;
            (前序遍历,访问)
            入p左子节点;
        }else{            //一种情况:当前节点为空,但栈不空
            p=出栈;
            (中序遍历,访问)
            入p右子节点;
        }
    }

}

具体代码如下:

void preOrder(BiTree *T)
{
	BiTree *stack[15];
	int top = -1;
	BiTree *p = T;
	while(p!=NULL||top!=-1)
	{
		if(p!=NULL){
			stack[++top] = p;
			printf("%c\t",p->data);
			p = p->lchild;
		}
		else{
			p = stack[top--];
			p = p->rchild;
		}
	}
}

中序遍历只需要将printf语句换到else语句里面即可。 

6:二叉树层次遍历 

核心思想:构建一个队列,pre指向头结点,从头节点开始进入while循环,打印出根节点后,遍历左孩子,不为空则存入队列中,同理在遍历右节点。如果front与real相同也就意味着队列为空,退出while循环层次遍历结束。

void levelOrder(BiTree *T)
{
	BiTree stack[15];
	int front=real=0;
	BiTree *cur,*pre;
	pre = T;
	while(pre!=NULL)
	{
		printf("%c",pre->data);
		cur = pre->lchild;
		if(cur!=NULL){
			stack[real++] = cur;
		}
		cur = pre->rchild;
		if(cur!=NULL){
			stack[real++] = cur;
		}
		if(front!=real)
		pre = stack[front++];
		else
		pre = NULL;
	}
}

  • 0
    点赞
  • 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、付费专栏及课程。

余额充值