设二叉树中每个结点的元素均为一个字符,按先序遍历的顺序建立二叉链表,编写递归算法交换该二叉树的左右孩子。
时间: 2024-04-29 07:21:50 浏览: 176
可以按照以下步骤编写递归算法:
1. 如果二叉树为空,直接返回。
2. 如果二叉树非空,则交换当前节点的左右孩子。
3. 递归交换左子树。
4. 递归交换右子树。
下面是对应的代码实现:
```python
class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
def invertTree(root: TreeNode) -> TreeNode:
if not root:
return None
root.left, root.right = root.right, root.left
invertTree(root.left)
invertTree(root.right)
return root
```
这个算法的时间复杂度是 O(n),其中 n 是二叉树节点的数量。因为每个节点只会被访问一次。空间复杂度是 O(h),其中 h 是二叉树的高度。在最坏的情况下,二叉树退化成链表,此时空间复杂度为 O(n)。
相关问题
设二叉树中的每个结点的元素均为一个字符,按先序遍历的顺序建立二叉链表,编写递归算法交换该二叉树的左右孩子
可以使用递归的方式来交换二叉树的左右孩子,具体实现如下:
1. 如果当前结点为空,则返回空。
2. 交换当前结点的左右孩子。
3. 递归交换当前结点的左子树。
4. 递归交换当前结点的右子树。
5. 返回交换后的二叉树根结点。
代码实现如下:
```python
class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
def swap_tree(root: TreeNode) -> TreeNode:
if not root:
return None
root.left, root.right = root.right, root.left
swap_tree(root.left)
swap_tree(root.right)
return root
```
时间复杂度为 O(n),其中 n 是二叉树中的结点个数。
设二叉树中每个结点的元素均为一个字符,按先序遍历的顺序建立二叉链表,编写算法求出该二叉树中第一条最长的路径
为了找到二叉树中最长的由连续字符组成的路径,你可以采用深度优先搜索(DFS)结合动态规划的方式来解决。以下是步骤:
1. **创建数据结构**:首先,为每个节点定义一个结构体或类,包含字符值、指向下个节点的指针以及当前路径是否已经形成连续序列的标记。
2. **辅助函数**:定义一个递归辅助函数,输入为当前节点及其连续路径信息。这个函数会检查两个条件:
- 如果当前节点为空,则结束路径,返回路径长度为0;
- 检查当前字符是否与前一个节点相同,并更新路径长度。如果相同,将当前节点加入路径并继续向下遍历;如果不相同,比较当前路径长度和已知最长路径,取较大者。
- 无论结果如何,都要尝试沿着左子树和右子树递归,因为最长路径可能在它们之中。
3. **主函数**:从根节点开始执行辅助函数,初始化最长路径长度为0。最后返回找到的最长路径长度。
4. **维护状态**:在遍历时,需要保存每一步的最长路径信息,以便于回溯时比较。
5. **处理边界情况**:对于空树,直接返回0。
**伪代码示例**:
```python
def longest_consecutive_path(root):
def dfs(node, prev_char, path_len, max_len):
if not node:
return max_len
cur_char = node.val
if cur_char == prev_char + 1 and path_len > 0:
path_len += 1
else:
path_len = 1 # 从新序列开始计算
max_len = max(max_len, path_len)
max_len = dfs(node.left, cur_char, path_len, max_len)
max_len = dfs(node.right, cur_char, path_len, max_len)
return max_len
return dfs(root, None, 0, 0) # 初始化最长路径为0
```
阅读全文