python coding with ChatGPT 打卡第19天| 二叉树:合并二叉树

相关推荐
python coding with ChatGPT 打卡第12天| 二叉树:理论基础
python coding with ChatGPT 打卡第13天| 二叉树的深度优先遍历
python coding with ChatGPT 打卡第14天| 二叉树的广度优先遍历
python coding with ChatGPT 打卡第15天| 二叉树:翻转二叉树、对称二叉树
python coding with ChatGPT 打卡第16天| 二叉树:完全二叉树、平衡二叉树、二叉树的所有路径、左叶子之和
python coding with ChatGPT 打卡第17天| 二叉树:找树左下角的值、路径总和
python coding with ChatGPT 打卡第18天| 二叉树:从中序与后序遍历序列构造二叉树、最大二叉树

合并二叉树

Key Points

将直接在 root1 上就地合并 root2,以避免额外的空间复杂度

相关题目

617. 合并二叉树

视频讲解

一起操作两个二叉树

重点分析

方法一:
递归(修改root1)

class Solution:
    def mergeTrees(self, root1: TreeNode, root2: TreeNode) -> TreeNode:
        # 递归终止条件: 
        #  但凡有一个节点为空, 就立刻返回另外一个. 如果另外一个也为None就直接返回None. 
        if not root1: 
            return root2
        if not root2: 
            return root1
        # 上面的递归终止条件保证了代码执行到这里root1, root2都非空. 
        root1.val += root2.val # 中
        root1.left = self.mergeTrees(root1.left, root2.left) #左
        root1.right = self.mergeTrees(root1.right, root2.right) # 右
        
        return root1 # ⚠️ 注意: 本题我们重复使用了题目给出的节点而不是创建新节点. 节省时间, 空间. 

方法二:
递归(创建新节点)

def mergeTrees(root1, root2):
    if not root1:
        return root2
    if not root2:
        return root1
    root = TreeNode(root1.val + root2.val)
    root.left = mergeTrees(root1.left, root2.left)
    root.right = mergeTrees(root1.right, root2.right)
    return root

方法三:
迭代法(修改root1)

class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right

def mergeTrees(root1, root2):
    if not root1:
        return root2
    if not root2:
        return root1
    
    # 使用队列存储需要合并的节点对
    queue = [(root1, root2)]
    while queue:
        node1, node2 = queue.pop(0)
        
        # 如果两个节点都不为 None,则合并它们的值
        if node1 is not None and node2 is not None:
            node1.val += node2.val
            
            # 如果 node1 的左子节点为空,我们直接将 node2 的左子节点链接过来
            if not node1.left:
                node1.left = node2.left
            else:
                queue.append((node1.left, node2.left))
            
            # 对于右子节点执行相同的操作
            if not node1.right:
                node1.right = node2.right
            else:
                queue.append((node1.right, node2.right))
                
    return root1

方法四:
迭代法(新建节点)

def mergeTrees(root1, root2):
    if not root1 and not root2:
        return None
    elif not root1:
        return TreeNode(root2.val, root2.left, root2.right)
    elif not root2:
        return TreeNode(root1.val, root1.left, root1.right)
    else:
        # 创建一个新节点,值为两个节点值的和
        newNode = TreeNode(root1.val + root2.val)
        
        # 使用队列存储节点对,以并行遍历两棵树
        queue = [(root1, root2, newNode)]
        
        while queue:
            node1, node2, new_node = queue.pop(0)
            
            # 处理左子节点
            if node1.left or node2.left:
                if node1.left and node2.left:
                    new_node.left = TreeNode(node1.left.val + node2.left.val)
                    queue.append((node1.left, node2.left, new_node.left))
                elif node1.left:
                    new_node.left = TreeNode(node1.left.val, node1.left.left, node1.left.right)
                else:  # node2.left
                    new_node.left = TreeNode(node2.left.val, node2.left.left, node2.left.right)
            
            # 处理右子节点
            if node1.right or node2.right:
                if node1.right and node2.right:
                    new_node.right = TreeNode(node1.right.val + node2.right.val)
                    queue.append((node1.right, node2.right, new_node.right))
                elif node1.right:
                    new_node.right = TreeNode(node1.right.val, node1.right.left, node1.right.right)
                else:  # node2.right
                    new_node.right = TreeNode(node2.right.val, node2.right.left, node2.right.right)
                    
        return newNode

在这里插入图片描述

  • 19
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是 C 语言的代码实现: ```c #include <stdio.h> #include <stdlib.h> // 定义二叉树节点结构体 typedef struct TreeNode { char data; struct TreeNode *left; struct TreeNode *right; } TreeNode; // 建立二叉树的函数 TreeNode* createTree() { char ch; scanf("%c", &ch); if (ch == '#') { return NULL; } TreeNode *node = (TreeNode*)malloc(sizeof(TreeNode)); node->data = ch; node->left = createTree(); node->right = createTree(); return node; } // 中序遍历二叉树的递归算法 void inorderRecursive(TreeNode *root) { if (root == NULL) { return; } inorderRecursive(root->left); printf("%c ", root->data); inorderRecursive(root->right); } // 中序遍历二叉树的非递归算法 void inorderNonrecursive(TreeNode *root) { TreeNode *stack[100]; int top = -1; TreeNode *curr = root; while (top != -1 || curr != NULL) { while (curr != NULL) { stack[++top] = curr; curr = curr->left; } curr = stack[top--]; printf("%c ", curr->data); curr = curr->right; } } // 求二叉树的高度 int getHeight(TreeNode *root) { if (root == NULL) { return 0; } int leftHeight = getHeight(root->left); int rightHeight = getHeight(root->right); return leftHeight > rightHeight ? leftHeight + 1 : rightHeight + 1; } // 定义哈夫曼树节点结构体 typedef struct HuffmanNode { int weight; char data; int parent; int leftChild; int rightChild; } HuffmanNode; // 找到两个权值最小的节点 void findMin(HuffmanNode *huffmanTree, int n, int *index1, int *index2) { int min1 = 100000, min2 = 100000; for (int i = 1; i <= n; i++) { if (huffmanTree[i].parent == 0 && huffmanTree[i].weight < min1) { min2 = min1; *index2 = *index1; min1 = huffmanTree[i].weight; *index1 = i; } else if (huffmanTree[i].parent == 0 && huffmanTree[i].weight < min2) { min2 = huffmanTree[i].weight; *index2 = i; } } } // 创建哈夫曼树 void createHuffmanTree(HuffmanNode *huffmanTree, int n) { int m = 2 * n - 1; for (int i = 1; i <= m; i++) { huffmanTree[i].weight = 0; huffmanTree[i].parent = 0; huffmanTree[i].leftChild = 0; huffmanTree[i].rightChild = 0; } for (int i = 1; i <= n; i++) { scanf("%d", &huffmanTree[i].weight); getchar(); huffmanTree[i].data = getchar(); } for (int i = n + 1; i <= m; i++) { int index1, index2; findMin(huffmanTree, i - 1, &index1, &index2); huffmanTree[i].weight = huffmanTree[index1].weight + huffmanTree[index2].weight; huffmanTree[i].leftChild = index1; huffmanTree[i].rightChild = index2; huffmanTree[index1].parent = i; huffmanTree[index2].parent = i; } } // 哈夫曼编码 void huffmanCoding(HuffmanNode *huffmanTree, int n) { char *code[n]; char *temp = (char*)malloc(n*sizeof(char)); temp[n-1] = '\0'; for (int i = 1; i <= n; i++) { int start = n - 1; int curr = i; int parent = huffmanTree[curr].parent; while (parent != 0) { if (huffmanTree[parent].leftChild == curr) { temp[--start] = '0'; } else { temp[--start] = '1'; } curr = parent; parent = huffmanTree[curr].parent; } code[i-1] = (char*)malloc((n-start)*sizeof(char)); for (int j = start; j < n; j++) { code[i-1][j-start] = temp[j]; } printf("%c: %s\n", huffmanTree[i].data, code[i-1]); } } int main() { // 1. 输入字符序列,建立二叉链表 TreeNode *root = createTree(); // 2. 中序遍历二叉树的递归算法 inorderRecursive(root); printf("\n"); // 3. 中序遍历二叉树的非递归算法 inorderNonrecursive(root); printf("\n"); // 4. 求二叉树的高度 printf("Height of the tree: %d\n", getHeight(root)); // 5. 为N个权值设计哈夫曼编码 int n; printf("Enter the number of characters: "); scanf("%d", &n); getchar(); HuffmanNode huffmanTree[2*n-1]; createHuffmanTree(huffmanTree, n); huffmanCoding(huffmanTree, n); return 0; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值