二叉树的基础操作

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
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值