617.合并二叉树
给定两个二叉树,想象当你将它们中的一个覆盖到另一个上时,两个二叉树的一些节点便会重叠。
你需要将他们合并为一个新的二叉树。合并的规则是如果两个节点重叠,那么将他们的值相加作为节点合并后的新值,否则不为 NULL 的节点将直接作为新二叉树的节点。
解法1:递归解决,以t1为基树,若t1为null则采用t2节点值,若t2也为空,则不需要了。按照根节点与左右节点依次递归。
/**
* 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) {
merge(t1,t2);
return t1;
}
void merge(TreeNode* &t1, TreeNode* &t2)
{
if(t1==nullptr)
t1 = t2;
else
{
if(t2==nullptr)
return;
else
{
t1->val+=t2->val;
merge(t1->left,t2->left);
merge(t1->right,t2->right);
}
}
}
};
226.翻转二叉树
翻转一棵二叉树。
示例:
输入:
4 / \ 2 7 / \ / \ 1 3 6 9
输出:
4 / \ 7 2 / \ / \ 9 6 3 1
解法:先翻转左右子树,然后分别对左右子数的左右节点进行翻转
/**
* 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:
void exchange(TreeNode* root)
{
TreeNode* node = root;
if(node!=NULL)
{
TreeNode* tmp = node->left;
node->left = node->right;
node->right = tmp;
}
}
TreeNode* invertTree(TreeNode* root) {
TreeNode* node = root;
if(root==NULL) return root;
invertTree(node->left);
invertTree(node->right);
exchange(node);
return root;
}
};
144.二叉树的前序遍历
解法1:递归求解(根左右)
解法2:利用栈,首先把root压入,然后再把右子树压入,再把左子树压入。
解法一:
/**
* 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:
vector<int> preorderTraversal(TreeNode* root) {
vector<int> res;
preorder(root,res);
return res;
}
void preorder(TreeNode* root,vector<int>& res)
{
if(root==NULL) return;
res.push_back(root->val);
preorder(root->left,res);
preorder(root->right,res);
}
};
解法二:
/**
* 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:
vector<int> preorderTraversal(TreeNode* root) {
vector<int> res;
if(root==NULL) return res;
stack<TreeNode*> stk;
stk.push(root);
while(!stk.empty())
{
auto node = stk.top();
res.push_back(node->val);
stk.pop();
if(node->right!=NULL) stk.push(node->right);
if(node->left!=NULL) stk.push(node->left);
}
return res;
}
};