设二叉树用二叉链表存储,编写程序,将二叉树的所有左右子树交换
时间: 2024-09-01 16:01:36 浏览: 81
假设我们有一个二叉链表结构的二叉树,我们可以编写一个递归函数来实现所有节点的左右子树交换。这里是一个简单的Python示例:
```python
class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
def swap_subtrees(root):
if root is None:
return None
# 先交换当前节点的左右子树
temp = root.left
root.left = root.right
root.right = temp
# 然后再递归地交换当前节点的左、右子树的新左右子树
swap_subtrees(root.left)
swap_subtrees(root.right)
# 使用示例
# 假设已经有了一个二叉树root
root = TreeNode(1, TreeNode(2), TreeNode(3))
swap_subtrees(root)
```
这个函数首先检查根节点是否为空,如果是,则返回None。然后交换根节点的左右子树,接着递归地对新的左右子树继续执行此操作。
运行此函数后,整个二叉树的左右子树都会发生交换。
相关问题
1.设二叉树采用二叉链表存储,编写函数,对二叉树中每个元素值为X的结点,删除以它为根的子树,并释放相应空间。 2.假设二叉树采用二叉链表存储结构,求二叉树b中结点值为x的结点的层次(或深度)
1. 要编写一个删除二叉树中所有值为 X 的节点的函数,首先需要遍历整个二叉链表树结构。这个过程可以递归地完成,从根节点开始搜索:
```python
def delete_nodes(root, value):
if not root:
return None
# 如果当前节点就是要删除的节点,替换为NULL
if root.value == value:
root = None
else:
# 递归处理左子树和右子树
root.left = delete_nodes(root.left, value)
root.right = delete_nodes(root.right, value)
return root
```
然后,对于释放空间的问题,由于二叉链表的节点通常包含指向前驱和后继节点的引用,所以在删除节点后,记得将它们的前驱或后继指向NULL,避免形成悬挂指针。
2. 求解二叉树中结点值为 x 的节点的层次,我们可以使用队列辅助的广度优先搜索(BFS)算法:
```python
def get_depth(node, target_value, current_level=0):
if not node:
return -1
if node.value == target_value:
return current_level
left_depth = get_depth(node.left, target_value, current_level + 1)
right_depth = get_depth(node.right, target_value, current_level + 1)
return max(left_depth, right_depth) if left_depth != -1 or right_depth != -1 else -1
# 使用时,传入二叉树的根节点和目标值即可
depth = get_depth(binary_tree_root, x)
```
用c语言表示1.设二叉树采用二叉链表存储,编写函数,对二叉树中每个元素值为X的结点,删除以它为根的子树,并释放相应空间。 2.假设二叉树采用二叉链表存储结构,求二叉树b中结点值为x的结点的层次(或深度)
1. 在 C 语言中,删除二叉树中所有值为 X 的节点通常涉及遍历整个二叉链表。这里是一个简单的示例,我们将展示如何递归地删除满足条件的节点并释放其内存:
```c
typedef struct TreeNode {
int val;
struct TreeNode* left;
struct TreeNode* right;
} TreeNode;
// 删除值为 X 的节点(仅删除根节点)
void delete_subtree(TreeNode** root, int x) {
if (*root == NULL) return; // 如果当前节点为空,直接返回
// 递归处理左右子树
delete_subtree(&(*root)->left, x);
delete_subtree(&(*root)->right, x);
// 当前节点值等于 x,删除节点
if ((*root)->val == x) {
free(*root); // 释放节点内存
*root = NULL; // 更新根指针
}
}
// 使用时,传入根节点指针即可
TreeNode* root = ...; // 初始化的二叉链表
int x = ...;
delete_subtree(&root, x);
```
2. 求二叉树中结点值为 x 的节点的层次(或深度),可以使用广度优先搜索 (BFS)。以下是相应的算法:
```c
#include <stdio.h>
#include <queue>
int maxDepth(TreeNode* node, int depth = 0) {
if (node == NULL) return depth; // 如果节点为空,返回当前层数
int left_depth = maxDepth(node->left, depth + 1);
int right_depth = maxDepth(node->right, depth + 1);
return left_depth > right_depth ? left_depth : right_depth; // 返回较大深度
}
// 同样需要已初始化的二叉链表根节点
TreeNode* root = ...;
int x = ...;
int result = maxDepth(root, 0);
printf("节点值为 %d 的节点的层次是 %d\n", x, result);
```
阅读全文