用C语言1.用递归或非递归方式求二叉树中序遍历下的第一个点 2.用递归或非递归方式求二叉树中序遍历下的最后一个点 3.用递归设计算法统计二叉树中叶子结点个数
时间: 2024-11-20 17:39:43 浏览: 21
C语言二叉树常见操作详解【前序,中序,后序,层次遍历及非递归查找,统计个数,比较,求深度】
1. **使用递归求二叉树中序遍历的第一个点**:
中序遍历二叉树的顺序是左-根-右,递归实现时,可以在遍历左子树的过程中查找第一个节点。非递归版本需要借助栈来保存遍历过程。
递归版伪代码:
```c
int findFirstInOrder(Node* root) {
if (root == NULL) return NULL;
return findFirstInOrder(root->left) ?: root; // 如果左子树为空,则返回当前节点
}
```
非递归版伪代码:
```c
Node* findFirstInOrder(Node* root) {
stack<Node*> s;
Node* current = root;
while (!s.empty() || current != NULL) {
while (current != NULL) {
s.push(current);
current = current->left;
}
current = s.top();
s.pop();
current = current->right;
}
return current;
}
```
2. **使用递归求二叉树中序遍历的最后一个点**:
在中序遍历时,最后一个节点是遍历完右子树后回溯到根节点,再访问左子树直到找到空节点。递归实现时直接返回即可。
递归版伪代码:
```c
Node* findLastInOrder(Node* root) {
if (root == NULL) return NULL;
Node* lastRight = findLastInOrder(root->right);
if (lastRight != NULL) return lastRight;
return root;
}
```
3. **使用递归计算二叉树中叶子结点个数**:
叶子节点是没有子节点的节点,递归遍历时只要检查当前节点是否有左右孩子即可。
递归版伪代码:
```c
int countLeaves(Node* node) {
if (node == NULL) return 0;
else if (node->left == NULL && node->right == NULL) return 1; // 叶子节点
else return countLeaves(node->left) + countLeaves(node->right);
}
```
阅读全文