在递归遍历二叉树求节点个数时,每次都是return 0那1怎么来的
时间: 2024-09-28 17:03:53 浏览: 25
在递归遍历二叉树计算节点个数的过程中,如果一个函数用于递归地检查一个节点是否存在,并返回该节点加上其左子树和右子树所有节点的数量,当遇到空节点(即叶子节点或根节点本身没有子节点的情况)时,函数通常会直接返回0,表示这个节点自身没有其他节点。
如果整个树为空,那么根节点也是空节点,所以初始调用`countNodes(root)`时,由于没有实际的节点可以计数,函数会返回0。递归的过程会从最底层开始,逐级向上累加子节点的数量,直到遍历完整棵树。因此,当你看到某个地方的代码返回0,实际上是在初始化或边界条件处理中,准备接收后续递归调用的结果并累计它们。
举个例子:
```python
def countNodes(node):
if node is None: # 空节点,返回0
return 0
else:
# 计算当前节点加上左右子树的节点数
return 1 + countNodes(node.left) + countNodes(node.right)
```
在这个函数中,每往下一层,就相当于“发现”了一个新的节点,于是结果就会加上1,这就是1的来源。最终的结果就是所有节点的总和,包括根节点。
相关问题
写一个程序,递归建立二叉树,先序递归遍历二叉树,中序递归遍历二叉树,后序递归遍历二叉树,层次递归遍历二叉树
在Python中,我们可以创建一个简单的二叉树节点类,并用递归方法实现各种遍历。这里是一个示例:
```python
# 定义二叉树节点
class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
# 递归构建二叉树(例如,给定一个列表)
def build_tree(values, index=0):
if index < len(values):
return TreeNode(values[index], build_tree(values, 2 * index + 1), build_tree(values, 2 * index + 2))
else:
return None
# 先序遍历(根-左-右)
def preorder_traversal(root):
if root is not None:
print(root.val)
preorder_traversal(root.left)
preorder_traversal(root.right)
# 中序遍历(左-根-右)
def inorder_traversal(root):
if root is not None:
inorder_traversal(root.left)
print(root.val)
inorder_traversal(root.right)
# 后序遍历(左-右-根)
def postorder_traversal(root):
if root is not None:
postorder_traversal(root.left)
postorder_traversal(root.right)
print(root.val)
# 层次遍历(广度优先搜索)
from collections import deque
def level_order_traversal(root):
if root is None:
return
queue = deque([root])
while queue:
node = queue.popleft()
print(node.val, end=' ')
if node.left:
queue.append(node.left)
if node.right:
queue.append(node.right)
# 创建一个二叉树实例并遍历
values = [1, 2, 3, 4, 5, 6]
root = build_tree(values)
print("Preorder:", " " .join(map(str, preorder_traversal(root))))
print("Inorder:", " " .join(map(str, inorder_traversal(root))))
print("Postorder:", " " .join(map(str, postorder_traversal(root))))
level_order_traversal(root)
```
在这个例子中,我们首先定义了一个`TreeNode`类,然后编写了四个递归函数用于遍历。最后,我们创建了一个二叉树并演示了如何使用这些函数进行遍历。
1、递归建立二叉树; 2、先序递归遍历二叉树; 3、中序递归遍历二叉树; 4、后序递归遍历二叉树。 5、中序非递归遍历二叉树 用C++语言
1. **递归建立二叉树**:
递归构建二叉树通常涉及到两个步骤:创建节点并将其左子树和右子树设置为其他递归调用的结果。例如,对于一个整数`val`,你可以这样定义:
```cpp
struct TreeNode {
int val;
TreeNode* left;
TreeNode* right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
// 递归函数示例
TreeNode* buildTree(int arr[], int start, int end) {
if (start > end)
return nullptr;
int mid = (start + end) / 2;
TreeNode* root = new TreeNode(arr[mid]);
root->left = buildTree(arr, start, mid - 1);
root->right = buildTree(arr, mid + 1, end);
return root;
}
```
2. **先序递归遍历二叉树**:
先序遍历顺序为根节点 -> 左子树 -> 右子树。C++实现如下:
```cpp
void preorderTraversal(TreeNode* root) {
if (root != nullptr) {
cout << root->val << " ";
preorderTraversal(root->left);
preorderTraversal(root->right);
}
}
```
3. **中序递归遍历二叉树**:
中序遍历顺序为左子树 -> 根节点 -> 右子树:
```cpp
void inorderTraversal(TreeNode* root) {
if (root != nullptr) {
inorderTraversal(root->left);
cout << root->val << " ";
inorderTraversal(root->right);
}
}
```
4. **后序递归遍历二叉树**:
后序遍历顺序为左子树 -> 右子树 -> 根节点:
```cpp
void postorderTraversal(TreeNode* root) {
if (root != nullptr) {
postorderTraversal(root->left);
postorderTraversal(root->right);
cout << root->val << " ";
}
}
```
5. **中序非递归遍历二叉树(使用栈)**:
使用迭代法(栈)实现中序遍历,避免了递归带来的额外开销:
```cpp
void inorderTraversalNonRecursive(TreeNode* root) {
stack<TreeNode*> s;
TreeNode* current = root;
while (current != nullptr || !s.empty()) {
while (current != nullptr) {
s.push(current);
current = current->left;
}
current = s.top();
s.pop();
cout << current->val << " ";
current = current->right;
}
}
```
阅读全文