合并俩棵二叉树

217 篇文章 0 订阅
174 篇文章 2 订阅

本题源自leetcode 617

----------------------------------------------------------------

思路:

  1  递归: 先合并根节点。在递归合并左子树和右子树。

  2  非递归: 用俩个栈保存节点。先将根节点都入栈。然后每次弹出节点合并。判断弹出的节点是否有左右子树。对子树进行合并。本题将第二棵树的节点合并到第一棵树上。

代码:

TreeNode* mergeTrees(TreeNode* t1, TreeNode* t2) {
        /*
        if(t1==NULL)
            return t2;
        if(t2==NULL)
            return t1;
        TreeNode* root=new TreeNode(t1->val + t2->val);
        root->left=mergeTrees(t1->left,t2->left);
        root->right=mergeTrees(t1->right,t2->right);
        return root;*/
        if(t1==NULL)
            return t2;
        if(t2==NULL)
            return t1;
        TreeNode* res=t1;
        stack<TreeNode*> s1,s2;
        s1.push(t1);
        s2.push(t2);
        
        while(s1.size()){
            TreeNode* p=s1.top();
            s1.pop();
            TreeNode* q=s2.top();
            s2.pop();
            p->val += q->val;
            if(p->left==NULL&&q->left!=NULL)
                p->left=q->left;
            else if(p->left && q->left){
                s1.push(p->left);
                s2.push(q->left);
            }
            if(p->right==NULL && q->right)
                p->right=q->right;
            else if(p->right && q->right){
                s1.push(p->right);
                s2.push(q->right);
            }
            
        }
        return res;
    }


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
#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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值