合并两棵二叉树

给定两棵任意的二叉树,将其合并,返回合并后的根节点。

思路:
这里写图片描述
基于先序遍历,如果root1存在就和root2的val相加,如果root1不存在,就把root2的引用直接赋值给root1。

代码如下:

public class Main {

    public static void main(String args[]) {

        TreeNode root1 = new TreeNode(1);
        TreeNode root1right = new TreeNode(2);
        root1.right = root1right;

        TreeNode root2 = new TreeNode(3);
        TreeNode root2left = new TreeNode(4);
        root2.left = root2left;
        TreeNode node1 = new TreeNode(5);
        TreeNode node2 = new TreeNode(6);
        root2left.left = node1;
        root2left.right = node2;

        TreeNode r = null;
        TreeNode root = merge(root1, root2);
        System.out.println("合并后的树先序遍历如下:");
        midTran(root);//先序遍历
    }

    public static void midTran(TreeNode root) {
        if (root == null)
            return;
        System.out.println(root.val);
        if (root.left != null)
            midTran(root.left);
        if (root.right != null)
            midTran(root.right);
    }

    public static TreeNode merge(TreeNode root1, TreeNode root2) {
        if (root1 == null)
            return root2;
        return mergeCore(root1, root2);
    }

    public static TreeNode mergeCore(TreeNode root1, TreeNode root2) {
        if (root2 != null) {
            root1.val += root2.val;
            if (root1.left == null)
                root1.left = root2.left;
            else
                mergeCore(root1.left, root2.left);
            if (root1.right == null)
                root1.right = root2.right;
            else
                mergeCore(root1.right, root2.right);
        }
        return root1;
    }
}
TreeNode定义如下:
public class TreeNode{
        int val = 0;
        TreeNode left = null, right = null;
        public TreeNode(int val){
        this.val = val;
        }
    }

输出如下:

合并后的树先序遍历如下:
4
4
5
6
2
“`

#include <stdio.h> #include <stdlib.h> // 二叉树结点的定义 struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right;}; // 创建新结点 struct TreeNode *createNode(int val) { struct TreeNode *node = (struct TreeNode *)malloc(sizeof(struct TreeNode)); node->val = val; node->left = NULL; node->right = NULL; return node;} // 合并两棵二叉树 struct TreeNode *mergeTrees(struct TreeNode *t1, struct TreeNode *t2) { if (!t1 && !t2) { return NULL; } else if (!t1) { return t2; } else if (!t2) { return t1; } struct TreeNode *root = createNode(t1->val + t2->val); root->left = mergeTrees(t1->left, t2->left); root->right = mergeTrees(t1->right, t2->right); return root;} // 层次遍历二叉树 void levelOrder(struct TreeNode *root) { if (!root) { return; } // 创建队列 struct TreeNode **queue = (struct TreeNode **)malloc(sizeof(struct TreeNode *) * 1000); int front = 0, rear = 0; queue[rear++] = root; while (front < rear) { struct TreeNode *node = queue[front++]; printf("%d ", node->val); if (node->left) { queue[rear++] = node->left; } if (node->right) { queue[rear++] = node->right; } } free(queue);}int main() { struct TreeNode *t1 = createNode(1); t1->left = createNode(3); t1->right = createNode(2); t1->left->left = createNode(5); struct TreeNode *t2 = createNode(2); t2->left = createNode(1); t2->right = createNode(3); t2->left->right = createNode(4); t2->right->right = createNode(7); struct TreeNode *root = mergeTrees(t1, t2); printf("合并后的二叉树:"); levelOrder(root); printf("\n"); return 0; }解释每行代码
06-07
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值