二叉树遍历操作详解

目录

一、思路详解

1.1 递归思路

1.2 递归分支图

1.3 递归栈帧图

二、C语言实现

2.1 前序遍历

2.2 中序遍历

2.3 后序遍历

三、查找值为x的结点

3.1 递归思路

3.2 C语言代码


一、思路详解

采用递归的思想解决问题,以高度为3的满二叉树为例。

1.1 递归思路

递归的本质是大化小分治的思想解决问题。

二叉树化成最小的问题即为一个单叶子节点(可看作左右子树都为空的二叉树)

递归的关键是找到结束条件重复执行的操作

  1. 结束条件:若为空结点则返回NULL,结束递归栈帧调用,返回上一个栈帧。
  2. 重复执行:传大树的左右子树,化为更小的树

1.2 递归分支图

1.3 递归栈帧图

二、C语言实现

2.1 前序遍历

void PrevOrder(BTNode* root)
{
	if (root == NULL)
	{
		printf("N ");
		return;
	}
	printf("%d ", root->data);
	PrevOrder(root->left);
	PrevOrder(root->right);
}

2.2 中序遍历

void InOrder(BTNode* root)
{
	if (root == NULL)
	{
		printf("N ");
		return;
	}
	InOrder(root->left);
	printf("%d ", root->data);
	InOrder(root->right);
}

2.3 后序遍历

void InOrder(BTNode* root)
{
	if (root == NULL)
	{
		printf("N ");
		return;
	}
	InOrder(root->left);
	printf("%d ", root->data);
	InOrder(root->right);
}

三、查找值为x的结点

3.1 递归思路

考虑特殊情况:

  1. 如果是空节点,返回NULL
  2. 如果是要找的结点,返回该节点

考虑一般情况:

  1. 每个节点都可被看作根节点,去重复递归左右子树

注意:由于函数只有一个返回值,所以在左子树如果遍历到右子树就无需再次遍历。

3.2 C语言代码

BTNode* TreeFind(BTNode* root, int x)
{
	if (root == NULL)
	{
		return NULL;
	}
	if (root->data == x)
	{
		return root;
	}
	BTNode* ret1 = TreeFind(root->left, x);
	if (ret1)
	{
		return ret1;
	}
	BTNode* ret2 = TreeFind(root->right, x);
	if (ret2)
	{
		return ret2;
	}
	return NULL;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值