c语言利用非递归遍历对二叉树的中序遍历,求某个结点的双亲节点; 求某个结点的前驱和后继; 求某个结点的兄弟结点;
时间: 2024-12-25 12:26:45 浏览: 0
**非递归中序遍历查找父节点:**
中序遍历遵循“左-根-右”的顺序,如果我们要找到某节点的父节点,当我们在遍历时遇到目标节点的值,而之前访问的是其左子树,那么当前节点就是该目标节点的父节点。因为中序遍历会先访问左子节点,所以在找到目标节点前的最后一个访问节点就是父节点。
```c
struct TreeNode *findParent(struct TreeNode *root, int target) {
if (!root || root->val == target) return NULL; // 根节点或目标节点为NULL时返回
if (root->val < target) { // 目标在右子树
return findParent(root->right, target);
} else { // 目标在左子树
return root;
}
}
```
**查找前驱和后继节点:**
- 前驱节点(predecessor):在一个有序的二叉搜索树中,小于目标节点的最大节点。
- 后继节点(successor):大于目标节点的最小节点。
```c
struct TreeNode *findPredecessorSuccessor(struct TreeNode *root, int target) {
struct TreeNode *prev = NULL, *next = NULL;
// 中序遍历找到前驱节点
while (root) {
if (root->val > target) {
next = root;
root = root->left;
} else {
prev = root;
root = root->right;
}
}
if (prev) return prev; // 如果找到,返回前驱
if (next) return next->left; // 若找不到前驱,返回target的后继
// 后续同理,只需交换左右子树即可
while (root) {
if (root->val < target) {
next = root;
root = root->right;
} else {
prev = root;
root = root->left;
}
}
if (prev) return prev->right;
return NULL; // 如果找不到后继,返回NULL
}
```
**查找兄弟节点:**
兄弟节点是指与给定节点在同一父节点下的其他节点。非递归查找需借助辅助栈。
```c
struct TreeNode *findBrotherNode(struct TreeNode *root, struct TreeNode *node) {
stack.push(root);
while (!stack.empty()) {
struct TreeNode *temp = stack.top();
stack.pop();
if (temp == node) {
if (temp->left) return temp->left;
if (temp->right) return temp->right;
// 如果父节点不是空,那么兄弟节点在父节点的另一个孩子上
if (!stack.empty())
return stack.top()->left ? stack.top()->left : stack.top()->right;
}
if (temp->right) stack.push(temp->right);
if (temp->left) stack.push(temp->left);
}
return NULL; // 如果未找到兄弟节点,返回NULL
}
```
阅读全文