[二叉树][easy] 平衡二叉树和合并二叉树

Posted 明月清辉入梦来

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[二叉树][easy] 平衡二叉树和合并二叉树相关的知识,希望对你有一定的参考价值。

平衡二叉树:这道题在leetcode上是easy难度,但是我觉得它比一般的medium难度的题还难点。该题只发递归,因为迭代版有点麻烦,没写出来。

给定一个二叉树,判断它是否是高度平衡的二叉树。


本题中,一棵高度平衡二叉树定义为:


一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。


示例 1:


给定二叉树 [3,9,20,null,null,15,7]


    3

   / \

  9  20

    /  \

   15   7

返回 true 。


示例 2:


给定二叉树 [1,2,2,3,3,null,null,4,4]


       1

      / \

     2   2

    / \

   3   3

  / \

 4   4

返回 false 。

class Solution {public: /**Recursive Methods*/ bool isBalanced(TreeNode* root) { return depth(root)!=-1; } int depth(TreeNode* root){ if(nullptr==root)return 0; int left=depth(root->left); if(left==-1) return -1; int right=depth(root->right); if(right==-1) return -1; return abs(left-right)>1? -1:max(left,right)+1;  } /* Iteration Methods*/};

合并二叉树:该题迭代版还是不错的

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


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


示例 1:


输入: 

Tree 1                     Tree 2                  

          1                         2                             

         / \                       / \                            

        3   2                     1   3                        

       /                           \   \                      

      5                             4   7                  

输出: 

合并后的树:

     3

    / \

   4   5

  / \   \ 

5   4   7

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

class Solution {public: /*recursive methods TreeNode* mergeTrees(TreeNode* t1, TreeNode* t2) { TreeNode* p=new TreeNode(0); if(nullptr==t1 && nullptr==t2) return nullptr; if(nullptr==t1) { p=t2; return p; } if(nullptr==t2){ p=t1; return p; } p->val=t1->val+t2->val; p->left=mergeTrees(t1->left,t2->left); p->right=mergeTrees(t1->right,t2->right); return p; } */ /*iteration methods*/ TreeNode* mergeTrees(TreeNode* t1, TreeNode* t2){ if(nullptr==t1) return t2; if(nullptr==t2) return t1; std::stack<std::pair<TreeNode*,TreeNode*>> node_stack; node_stack.push(std::make_pair(t1,t2)); while(!node_stack.empty()){ auto p1=node_stack.top().first; auto p2=node_stack.top().second; node_stack.pop(); if(nullptr==p2){continue;} p1->val+=p2->val; if(nullptr==p1->left) {p1->left=p2->left;} else{ node_stack.push(std::make_pair(p1->left,p2->left)); } if(nullptr==p1->right) {p1->right=p2->right;} else{ node_stack.push(std::make_pair(p1->right,p2->right));  } } return t1; } };


以上是关于[二叉树][easy] 平衡二叉树和合并二叉树的主要内容,如果未能解决你的问题,请参考以下文章

二叉排序树和平衡二叉树

二叉排序树和平衡二叉树

你真的懂树吗?二叉树AVL平衡二叉树伸展树B-树和B+树原理和实现代码详解...

你真的懂树吗?二叉树AVL平衡二叉树伸展树B-树和B+树原理和实现代码详解...

你真的懂树吗?二叉树AVL平衡二叉树伸展树B-树和B+树原理和实现代码详解...

你真的懂树吗?二叉树AVL平衡二叉树伸展树B-树和B+树原理和实现代码详解...