求二叉树某结点的左兄弟结点c语言完整测试代码
时间: 2023-07-13 22:17:37 浏览: 96
假设你已经定义好了二叉树的结构体 `TreeNode`,其中包含了指向左右子树的指针 `left` 和 `right`,以及存储节点值的变量 `value`。那么,你可以按照以下方式编写求二叉树某结点的左兄弟结点的 C 语言代码:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义二叉树结点
typedef struct TreeNode {
int value;
struct TreeNode* left;
struct TreeNode* right;
} TreeNode;
// 查找某结点的左兄弟结点
TreeNode* findLeftSibling(TreeNode* root, TreeNode* node) {
if (node == NULL || node == root) { // 如果传入的结点为空或根结点,则返回 NULL
return NULL;
}
TreeNode* parent = NULL;
TreeNode* current = root;
while (current != NULL && current != node) { // 查找 node 的父结点
parent = current;
if (node->value < current->value) {
current = current->left;
} else {
current = current->right;
}
}
if (current == NULL) { // 如果没有找到 node,则返回 NULL
return NULL;
}
if (parent == NULL) { // 如果 node 没有左兄弟,则返回 NULL
return NULL;
}
if (parent->left == node) { // 如果 node 是其父结点的左子结点,则返回其父结点的右子结点
return parent->right;
}
// 如果 node 是其父结点的右子结点,则返回其父结点的左子结点
return parent->left;
}
// 测试代码
int main() {
// 构建一棵二叉树
TreeNode* root = (TreeNode*)malloc(sizeof(TreeNode));
root->value = 5;
root->left = (TreeNode*)malloc(sizeof(TreeNode));
root->left->value = 3;
root->left->left = (TreeNode*)malloc(sizeof(TreeNode));
root->left->left->value = 1;
root->left->left->left = NULL;
root->left->left->right = NULL;
root->left->right = (TreeNode*)malloc(sizeof(TreeNode));
root->left->right->value = 4;
root->left->right->left = NULL;
root->left->right->right = NULL;
root->right = (TreeNode*)malloc(sizeof(TreeNode));
root->right->value = 7;
root->right->left = (TreeNode*)malloc(sizeof(TreeNode));
root->right->left->value = 6;
root->right->left->left = NULL;
root->right->left->right = NULL;
root->right->right = (TreeNode*)malloc(sizeof(TreeNode));
root->right->right->value = 8;
root->right->right->left = NULL;
root->right->right->right = NULL;
// 测试查找某结点的左兄弟结点
TreeNode* node = root->left->right; // 选择二叉树中的某个结点
TreeNode* leftSibling = findLeftSibling(root, node);
if (leftSibling == NULL) {
printf("该结点没有左兄弟结点\n");
} else {
printf("该结点的左兄弟结点的值为:%d\n", leftSibling->value);
}
return 0;
}
```
在上面的代码中,我们定义了 `findLeftSibling` 函数来查找某个结点的左兄弟结点。该函数接收两个参数:二叉树的根结点 `root` 和要查找左兄弟结点的结点 `node`。首先,我们检查 `node` 是否为空或是否为根结点,如果是,则直接返回 NULL。接着,我们使用循环来查找 `node` 的父结点 `parent`,并根据 `node` 的值与当前结点的值比较来判断是向左子树还是向右子树查找。如果找到了 `node`,则判断其是否有左兄弟结点,如果有,则返回左兄弟结点,否则返回 NULL。
阅读全文