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

定义与性质二叉树的每个节点至多只有两棵子树,二叉树的子树有左右之分,不可颠倒。二叉树的第i层至多有2^(i-1)个节点;深度为k的二叉树的节点至多有2^k - 1个节点;对任一个二叉树,其叶子节点的个数为n,度为2的节点个数为m,n = m + 1 。(摘自wiki)节点定义typedef struct BinaryTreeNode{ char value; stru
摘要由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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值