目录
一、思路详解
1.1 递归思路
1.2 递归分支图
1.3 递归栈帧图
二、C语言实现
2.1 前序遍历
2.2 中序遍历
2.3 后序遍历
三、查找值为x的结点
3.1 递归思路
3.2 C语言代码
一、思路详解
采用递归的思想解决问题,以高度为3的满二叉树为例。
1.1 递归思路
考虑特殊情况:
- 如果是空节点,返回NULL
- 如果不空返回该节点的值域
考虑一般情况:
-
每个节点都可被看作根节点,去重复递归左右子树
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 递归思路
考虑特殊情况:
- 如果是空节点,返回NULL
- 如果是要找的结点,返回该节点
考虑一般情况:
- 每个节点都可被看作根节点,去重复递归左右子树
注意:由于函数只有一个返回值,所以在左子树如果遍历到右子树就无需再次遍历。
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;
}