C语言,设一棵二叉树结点数据域的值互不相同, 试编写算法程序查找数据域值为x的结点, 输出该结点的层数。
时间: 2023-04-09 20:03:38 浏览: 133
可以回答这个问题。以下是算法程序:
```
int findNodeLevel(TreeNode* root, int x) {
if (root == NULL) {
return -1;
}
if (root->val == x) {
return 0;
}
int leftLevel = findNodeLevel(root->left, x);
if (leftLevel >= 0) {
return leftLevel + 1;
}
int rightLevel = findNodeLevel(root->right, x);
if (rightLevel >= 0) {
return rightLevel + 1;
}
return -1;
}
```
其中,TreeNode 是二叉树的结点类型,val 表示结点的数据域值。这个算法采用递归的方式查找数据域值为 x 的结点,返回该结点的层数。如果找不到该结点,则返回 -1。
相关问题
现有一棵二叉树的中序遍历序列,问这棵二叉树是否是二叉查找树。 二叉查找树的定义:在二叉树定义的基础上,满足左子结点的数据域小于或等于根结点的数据域,右子结点的数据域大于根结点的数据域。 输入描述 第一行一个整数n(1≤n≤50),表示二叉查找树的结点个数; 第二行n个整数ai(1≤ai≤100),表示中序遍历序列。数据保证序列元素互不相同。 输出描述 如果是二叉查找树,那么输出Yes,否则输出No。 C语言回答
可以通过中序遍历的特点来判断是否是二叉查找树。具体步骤如下:
1. 根据中序遍历的顺序,将输入的整数数组构建成一棵二叉树;
2. 遍历这棵二叉树,如果发现任意一个结点的值小于其左子树中的某个结点的值,或者大于其右子树中的某个结点的值,那么这棵二叉树就不是二叉查找树;
3. 如果遍历完整棵树都没有发现上述情况,那么这棵二叉树就是二叉查找树。
以下是C语言的代码实现:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
} TreeNode;
TreeNode *buildTree(int *nums, int start, int end) {
if (start > end) {
return NULL;
}
int mid = (start + end) / 2;
TreeNode *root = (TreeNode *) malloc(sizeof(TreeNode));
root->val = nums[mid];
root->left = buildTree(nums, start, mid - 1);
root->right = buildTree(nums, mid + 1, end);
return root;
}
int isValidBST(TreeNode *root, int *prev) {
if (root == NULL) {
return 1;
}
if (!isValidBST(root->left, prev)) {
return 0;
}
if (*prev != -1 && root->val <= *prev) {
return 0;
}
*prev = root->val;
return isValidBST(root->right, prev);
}
int main() {
int n;
scanf("%d", &n);
int *nums = (int *) malloc(n * sizeof(int));
for (int i = 0; i < n; i++) {
scanf("%d", &nums[i]);
}
TreeNode *root = buildTree(nums, 0, n - 1);
int prev = -1;
if (isValidBST(root, &prev)) {
printf("Yes\n");
} else {
printf("No\n");
}
return 0;
}
```
其中,buildTree函数用于构建二叉树,isValidBST函数用于判断二叉树是否是二叉查找树。prev参数用于记录上一个遍历到的结点的值,初始值为-1。isValidBST函数先递归遍历左子树,再判断当前结点的值是否大于上一个遍历到的结点的值,如果不是则返回0;然后将当前结点的值赋给prev,再递归遍历右子树。如果整棵树都符合要求,那么isValidBST函数返回1,否则返回0。最后根据isValidBST函数的返回值判断二叉树是否是二叉查找树。
阅读全文