题解 | #合并二叉树#

合并二叉树

http://www.nowcoder.com/practice/7298353c24cc42e3bd5f0e0bd3d1d759

/**
 * struct TreeNode {
 *    int val;
 *    struct TreeNode *left;
 *    struct TreeNode *right;
 * };
 */

class Solution {
public:
    /**
     * 
     * @param t1 TreeNode类 
     * @param t2 TreeNode类 
     * @return TreeNode类
     */
    //非递归版本
    //非递归就是用栈来模拟递归行为
    //本题需要两个栈,需要两个栈不是以为有两个二叉树,而是因为一个栈用来存节点,一个栈用来存节点的值(其实也可以用一个栈)
    //依然用前序遍历,其实本题使用前中后甚至层序遍历都没问题
    TreeNode* mergeTrees(TreeNode* t1, TreeNode* t2) {
        // write code here
        if(t1==NULL&&t2==NULL)
            return NULL;
        else if(t1==NULL)
            return t2;
        else if(t2==NULL)
            return t1;
        //排除掉特殊情况后,此时这两颗树都非空
        stack<int > dataStack;//数据栈
        stack<TreeNode*> nodeStack;//节点栈
        dataStack.push(t2->val);dataStack.push(t1->val);
        nodeStack.push(t2);nodeStack.push(t1);
        while(!dataStack.empty()&&!nodeStack.empty()){//栈非空时
            //每次各从数据栈和节点栈中成双的弹出两个节点
            int data1=dataStack.top();dataStack.pop();
            int data2=dataStack.top();dataStack.pop();
            TreeNode*node1=nodeStack.top();nodeStack.pop();
            TreeNode*node2=nodeStack.top();nodeStack.pop();
            node1->val=node1->val+node2->val;//根据题意都不为空时相加,这里为什么没有判断是否为空?因为我们在下面的处理中直接去掉为空的可能
            if(node1->right&&node2->right){//当两个树的右节点都存在时
                dataStack.push(node2->right->val);
                dataStack.push(node1->right->val);
                nodeStack.push(node2->right);
                nodeStack.push(node1->right);
            }
            else if(!node1->right){//如果t1树的右节点为空
                node1->right=node2->right;//直接替换
            }
            //如果t2树的右节点为空那什么也不做
            //对左子树同理
            if(node1->left&&node2->left){
                dataStack.push(node2->left->val);
                dataStack.push(node1->left->val);
                nodeStack.push(node2->left);
                nodeStack.push(node1->left);
            }
            else if(!node1->left){
                node1->left=node2->left;
            }
        }
        return t1;
    }
};
全部评论

相关推荐

02-18 13:28
门头沟学院 Java
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
正在热议
更多
# 长得好看会提高面试通过率吗? #
4471次浏览 48人参与
# 离家近房租贵VS离家远但房租低,怎么选 #
16917次浏览 137人参与
# 巨人网络春招 #
11550次浏览 229人参与
# 沪漂/北漂你觉得哪个更苦? #
1616次浏览 41人参与
# 你的实习产出是真实的还是包装的? #
3230次浏览 54人参与
# 春招至今,你的战绩如何? #
16140次浏览 146人参与
# 米连集团26产品管培生项目 #
7387次浏览 226人参与
# HR最不可信的一句话是__ #
1107次浏览 32人参与
# AI面会问哪些问题? #
971次浏览 24人参与
# 你做过最难的笔试是哪家公司 #
1306次浏览 23人参与
# AI时代,哪个岗位还有“活路” #
2930次浏览 53人参与
# 不考虑薪资和职业,你最想做什么工作呢? #
152954次浏览 889人参与
# 简历第一个项目做什么 #
32195次浏览 363人参与
# 军工所铁饭碗 vs 互联网高薪资,你会选谁 #
8032次浏览 43人参与
# XX请雇我工作 #
51164次浏览 171人参与
# 简历中的项目经历要怎么写? #
311149次浏览 4272人参与
# 投格力的你,拿到offer了吗? #
178382次浏览 891人参与
# 你最满意的offer薪资是哪家公司? #
77008次浏览 375人参与
# AI时代,哪些岗位最容易被淘汰 #
64856次浏览 893人参与
# 当下环境,你会继续卷互联网,还是看其他行业机会 #
187643次浏览 1123人参与
# 你怎么看待AI面试 #
180882次浏览 1318人参与
# 正在春招的你,也参与了去年秋招吗? #
364407次浏览 2642人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务