【LeetCode】617. 合并二叉树

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u012736685/article/details/88218520

一、题目描述

给定两个二叉树,想象当你将它们中的一个覆盖到另一个上时,两个二叉树的一些节点便会重叠。

你需要将他们合并为一个新的二叉树。合并的规则是如果两个节点重叠,那么将他们的值相加作为节点合并后的新值,否则不为 NULL 的节点将直接作为新二叉树的节点。

二、示例

示例 1:

输入: 
	Tree 1                     Tree 2                  
          1                         2                             
         / \                       / \                            
        3   2                     1   3                        
       /                           \   \                      
      5                             4   7                  
输出: 
合并后的树:
	     3
	    / \
	   4   5
	  / \   \ 
	 5   4   7

注意: 合并必须从两个树的根节点开始。

三、分析

思路:在遍历二叉树的同时相加节点的 val 值。

四、实现

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    TreeNode* mergeTrees(TreeNode* t1, TreeNode* t2) {
        if(t1==NULL && t2 ==NULL){
            return NULL;
        }
        else if(t1==NULL){
            return t2;
        }
        else if(t2==NULL){
            return t1;
        }
        t1->val = t1->val + t2->val;
        t1->left = mergeTrees(t1->left, t2->left);
        t1->right = mergeTrees(t1->right, t2->right);
        return t1;
    }
};

五、二叉树遍历

#include<iostream>
#include<queue>
#include<vector>
#include<stack>
using namespace std;

struct TreeNode
{
	int val;
	struct TreeNode *left;
	struct TreeNode *right;
	TreeNode(int x): val(x), left(NULL), right(NULL) {}
};

// 1. 前序遍历
void PreOrder(TreeNode *T) 
{
	if (T == NULL)
		return NULL;
	cout << T->val << endl;
	PreOrder(T->left);
	PreOrder(T->right);
}

// 2. 非递归,前序遍历
void PreOrder1(TreeNode *T)
{
	if(T == NULL)
		return NULL;
	stack<TreeNode*> s;
	s.push(T);
	TreeNode *temp;
	while(!s.empty())
	{
		temp = s.top();
		cout << temp->val;
		s.pop();
		if(temp->left)
			s.push(temp->left);
		if(temp->right)
			s.push(temp->right);
	}
}

// 中序遍历
void InOrder(TreeNode *T)
{
	if(T == NULL)
		return NULL;
	InOrder(T->left);
	cout << T->val << endl;
	InOrder(T->right);
}

// 后序遍历
void PostOrder(TreeNode *T)
{
	if(T == NULL)
		return NULL;
	PostOrder(T->left);
	PostOrder(T->right);
	cout << T->val <<endl;
}

// 层析遍历
void LevelOrder(TreeNode *T)
{
	if(T == NULL)
		return NULL;
	TreeNode *temp;
	queue<TreeNode *> q;
	q.push(T);
	while(!q.empty())
	{
		temp = q.front();   // The first of queue
		cout << temp->val;
		if (temp->left)
		{
			q.push(temp->left);
		}
		if (temp->right)
		{
			q.push(temp->right);
		}
		q.pop();
	}
}

// 深度遍历
void DeepOrder(TreeNode *T)
{
	if(T == NULL)
		return NULL;
	TreeNode *temp;
	stack<TreeNode*> s;
	s.push(T);
	while(!s.empty())
	{
		temp = s.top();
		cout << temp->val;
		s.pop();
		if(temp->left)
			s.push(temp->left);
		if(temp->right)
			s.push(temp->right);
	}
}

猜你喜欢

转载自blog.csdn.net/u012736685/article/details/88218520