二叉树的建立(根据遍历结果构建)、遍历(非递归)和搜索

这篇博客介绍了二叉树的定义和性质,包括节点定义、建立过程。重点讲解了非递归的前序遍历、中序遍历、后序遍历以及层序遍历的实现方法。同时,还阐述了如何根据遍历结果来构建二叉树,包括由前序遍历和中序遍历,以及中序遍历和后序遍历构建二叉树的算法。
摘要由CSDN通过智能技术生成

定义与性质

二叉树的每个节点至多只有两棵子树,二叉树的子树有左右之分,不可颠倒。二叉树的第i层至多有2^(i-1)个节点;深度为k的二叉树的节点至多有2^k - 1个节点;对任一个二叉树,其叶子节点的个数为n,度为2的节点个数为m,n = m + 1 。(摘自wiki)


节点定义

typedef struct BinaryTreeNode
{
	char value;
	struct BinaryTreeNode* lchild;
	struct BinaryTreeNode* rchild;
}node, *BTree;


建立


下面的代码可以生成上图所示的二叉树。

/*
	建立二叉树
	输入范例:123##45###6##
*/
BTree Create(BTree T)
{
	char v;

	v = getchar();

	if(v == '#')
		T = NULL;
	else
	{
		T = (node*) malloc(sizeof(node));
		if(!T)
			exit(0);

		T->value = v;
		T->lchild = Create(T->lchild);
		T->rchild = Create(T->rchild);
	}
	return T;
}


遍历

前序遍历


前序遍历的含义是先访问根节点,再访问根节点的左子树,然后访问右子树。

递归实现

/*
	前序遍历二叉树(递归)
*/
void preOrder(BTree T)
{
	if(T)
	{
		printf("%c ", T->value);
		preOrder(T->lchild);
		preOrder(T->rchild);
	}
}


非递归实现

可以将每一个节点都看做是根节点,前序遍历的非递归处理过程如下:

对每个节点node,有

1.  访问node,将node入栈

2. 判断node的左孩子节点是否为空。若为空,则将node出栈,并将node设为node的右孩子节点,重复第一步;若不为空 ,则将node设为node

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值