目录
一、思路详解
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;
}