编写递归算法,在二叉树中求位于先序序列中第k个位置的结点的值。
时间: 2023-04-26 09:02:37 浏览: 91
递归算法如下:
1. 如果树为空,返回空。
2. 如果k等于1,返回根节点的值。
3. 否则,递归地在左子树中查找第k-1个位置的节点的值,如果找到了,返回该值;否则,在右子树中查找第k-1-left_size个位置的节点的值,其中left_size是左子树的节点数。
代码实现如下:
```
int kthNodeValue(TreeNode* root, int k) {
if (!root) return -1; // 空树返回-1
int left_size = root->left ? root->left->size : 0; // 左子树节点数
if (k == 1) return root->val; // 第1个位置是根节点
if (k == left_size + 1) return root->val; // 第left_size+1个位置是根节点
if (k <= left_size) return kthNodeValue(root->left, k); // 在左子树中查找第k-1个位置的节点的值
return kthNodeValue(root->right, k - left_size - 1); // 在右子树中查找第k-1-left_size个位置的节点的值
}
```
其中,TreeNode结构体定义如下:
```
struct TreeNode {
int val;
int size; // 节点数
TreeNode* left;
TreeNode* right;
TreeNode(int x) : val(x), size(1), left(NULL), right(NULL) {}
};
```
在构建二叉树时,需要维护每个节点的size,即节点的子树节点数。可以在插入节点时更新size,代码如下:
```
void insert(TreeNode*& root, int val) {
if (!root) {
root = new TreeNode(val);
return;
}
root->size++;
if (val < root->val) insert(root->left, val);
else insert(root->right, val);
}
```
阅读全文