1.用递归或非递归方式求二叉树中序遍历下的第一个点 2.用递归或非递归方式求二叉树中序遍历下的最后一个点 3.用递归设计算法统计二叉树中叶子结点个数
时间: 2024-11-13 17:23:16 浏览: 4
PHP基于非递归算法实现先序、中序及后序遍历二叉树操作示例
1. **二叉树中序遍历的第一个点(递归与非递归)**:
- 递归方式:
```c
// 中序遍历找首个节点(假设最小节点位于最左侧)
TreeNode* firstInOrder(TreeNode* root) {
if (root == NULL) return NULL;
if (root->left == NULL) return root;
return firstInOrder(root->left);
}
```
- 非递归方式(栈):
```c
TreeNode* firstInOrderNonRecursive(TreeNode* root) {
stack<TreeNode*> s;
TreeNode* first = NULL;
while (!s.isEmpty() || root != NULL) {
while (root != NULL) {
s.push(root);
root = root->left;
}
root = s.top();
s.pop();
if (first == NULL) first = root; // 栈顶第一个不是左孩子的就是第一个
root = root->right;
}
return first;
}
```
2. **二叉树中序遍历的最后一个点(递归与非递归)**:
- 递归方式:
```c
// 中序遍历找最后节点
TreeNode* lastInOrder(TreeNode* root) {
if (root == NULL) return NULL;
TreeNode* lastLeft = lastInOrder(root->left);
if (lastLeft == NULL) return root; // 如果左子树已经遍历完,当前节点是最后一个
return lastLeft;
}
```
- 非递归方式(需要辅助栈):
```c
TreeNode* lastInOrderNonRecursive(TreeNode* root) {
stack<TreeNode*> s1, s2;
TreeNode* last = NULL;
while (!s1.isEmpty() || root != NULL) {
while (root != NULL) {
s1.push(root);
root = root->left;
}
root = s1.top();
s1.pop();
while (!s1.isEmpty() && s1.top()->left == root) { // 移除所有等于当前节点的左兄弟
s2.push(s1.top());
s1.pop();
}
if (last == NULL) last = root; // 当前节点可能是最后一个
root = s2.empty() ? root->right : NULL; // 如果只剩右子树或栈已清空,说明是最后一个
}
return last;
}
```
3. **递归计算二叉树中叶子结点个数**:
```c
int countLeaves(TreeNode* root) {
if (root == NULL) return 0;
if (root->left == NULL && root->right == NULL) return 1; // 叶子节点
return countLeaves(root->left) + countLeaves(root->right);
}
```
这里直接判断每个节点是否有左右子节点即可。
阅读全文