DAY17 平衡二叉树 二叉树的所有路径 左叶子之和

110.平衡二叉树

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

本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。

示例 1:

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

返回 true 

 这题如果用递归的话,使用后序遍历,求出二叉树的高度才行,如果高度差大于1,返回-1即可,最后看返回的数是啥就行。

class Solution {
public:
    int blanced(TreeNode* root)
    {
        if(root==NULL)return 0;
        int left=blanced(root->left);
        if(left==-1)return -1;
        int right=blanced(root->right);
        if(right==-1)return -1;
        int res;
        if(abs(left-right)>1)res=-1;
        else
        res=1+max(left,right);
        return res;
    }
    bool isBalanced(TreeNode* root) {
        int res=blanced(root);
        if(res==-1)return 0;
        else 
        return 1;
    }
};

用迭代方法的话,看左右字数的高度差就行,深度用层序遍历,然后遍历每个结点就行:

class Solution {
public:
    int maxDepth(TreeNode* root) {
      queue<TreeNode*> qu;
            int size=0;
            int depth=0;
            if(root!=NULL)qu.push(root);
            while(!qu.empty())
            {
                size=qu.size();
               for(int i=0;i<size;i++)
                {   auto tempnode=qu.front();
                    qu.pop();
                    if(tempnode->left)qu.push(tempnode->left);
                    if(tempnode->right)qu.push(tempnode->right);
                }
                depth++;
            }
            return depth;
    }
    bool isBalanced(TreeNode* root) {
        stack<TreeNode*> st;
        if(root==NULL)return 1;
        st.push(root);
        while(!st.empty())
        {
               auto tempnode=st.top();
               st.pop();
               if(tempnode!=NULL)
               {
                   if(abs(maxDepth(tempnode->left)-maxDepth(tempnode->right))>1)return 0;
               }
               else
                   continue;
                    if(tempnode->left)st.push(tempnode->right);
                    if(tempnode->right)st.push(tempnode->left);
        }
        return 1;
    
    }
};

257. 二叉树的所有路径

给定一个二叉树,返回所有从根节点到叶子节点的路径。

说明: 叶子节点是指没有子节点的节点。

示例:

257.二叉树的所有路径1

 这是我第一次遇到“回溯”,这题使用递归+回溯的方法即可

class Solution {
public:
    void path(TreeNode* root,vector<int>& res,vector<string>& result)
    {    if(root==NULL)return;
        res.push_back(root->val);
        if(root->left==NULL&&root->right==NULL)
        {   string path1;
            for(int i=0;i<res.size();i++)
            {path1+=to_string(res[i]);
            if(i<res.size()-1)
             path1+="->";
            }
            result.push_back(path1);
            return;}
         if(root->left){path(root->left,res,result);res.pop_back();}
         if(root->right){path(root->right,res,result);res.pop_back();}
    }


    vector<string> binaryTreePaths(TreeNode* root) {
           vector<int> res;
           vector<string> result;
           path(root,res,result);
           return result;
    }
};

 两个栈做法,一个栈负责遍历,另外一个栈在遍历的过程中保存路径就行:

class Solution {
public:
    vector<string> binaryTreePaths(TreeNode* root) {
          stack<TreeNode*> treest;
          stack<string> pathst;
          vector<string> res;
         if(root==NULL)return res;
           treest.push(root);
           pathst.push(to_string(root->val));
           while(!treest.empty())
           {
               auto node=treest.top(); treest.pop();
               string path=pathst.top();pathst.pop();
               if(node->left==NULL&&node->right==NULL)
               {
                   res.push_back(path);
               }
               if(node->left)
               {
                   treest.push(node->left);
                   pathst.push(path+"->"+to_string(node->left->val));
               }
                 if(node->right)
               {
                   treest.push(node->right);
                   pathst.push(path+"->"+to_string(node->right->val));
               }

           }
               return res;
    }
};

404.左叶子之和

计算给定二叉树的所有左叶子之和。

示例:

这个题最需要注意的地方是,左叶子的判定条件,有了这个条件,无论是递归还是遍历都可以做出这道题

class Solution {
public:
    int sumOfLeftLeaves(TreeNode* root) {
              stack<TreeNode*> st;
              int sum=0;
              if(root==NULL)return 0;
              st.push(root);
              while(!st.empty())
              {
                  auto node=st.top();
                  st.pop();
                  if(node==NULL)continue;
                  else if(node->left&&!node->left->left&&!node->left->right)
                  {
                      sum+=node->left->val;
                  }
                  if(node->right)st.push(node->right);
                  if(node->left)st.push(node->left);
              }
       return sum;
    }
};
class Solution {
public:
    int sumOfLeftLeaves(TreeNode* root) {
              queue<TreeNode* > qu;
              int size=0;
              int sum=0;
              if(root==NULL)return 0;
              qu.push(root);
              while(!qu.empty())
              {
                  size=qu.size();
                  while(size--)
                  {
                      auto node=qu.front();
                      qu.pop();
                      if(node->left&&node->left->left==NULL&&node->left->right==NULL)
                      sum+=node->left->val;
                      if(node->left)qu.push(node->left);
                      if(node->right)qu.push(node->right);
                  }
              }
       return sum;
    }
};
class Solution {
public:
    int sum(TreeNode* root)
    {   if(root==NULL)return 0;
        if(root->left==NULL&&root->right==NULL)return 0;
        int left=sum(root->left);
        if(root->left&&root->left->left==NULL&&root->left->right==NULL)
        left=root->left->val;
        int right=sum(root->right);
        int sum=right+left;
        return sum;
    }
    int sumOfLeftLeaves(TreeNode* root) {
              return sum(root);
    }
};

一入递归深似海,shift

  • 8
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
首先,我们需要了解什么是扩展二叉树。扩展二叉树是一种二叉树的表示方法,其中每个非叶子节点都有两个子节点,但其中一个或两个子节点可以为空。因此,扩展二叉树的前序序列可以被表示为一个字符串,其中空节点用字符“#”表示。例如,扩展二叉树“1(2(4(#)(#))(5(#)(#)))”可以表示为前序序列“124##5##”。 现在我们来考虑如何构建二叉树。我们可以使用递归的方法来构建二叉树,每次递归都处理当前节点的子树和右子树。具体来说,我们可以先读取前序序列中的下一个字符,如果当前字符是“#”,则表示该节点为空;否则,我们可以将该字符转换为数字并创建一个新节点,然后递归构建该节点的子树和右子树。 下面是 Python 代码实现: ``` python class TreeNode: def __init__(self, val=0, left=None, right=None): self.val = val self.left = left self.right = right def buildTree(preorder): def helper(): val = preorder.pop(0) if val == '#': return None node = TreeNode(int(val)) node.left = helper() node.right = helper() return node return helper() ``` 接下来,我们需要计算给定二叉树的所有叶子之和叶子是指没有右子树的子树节点。因此,我们可以使用递归的方法遍历整个二叉树,在遍历的过程中累加所有叶子节点的值。具体来说,对于每个节点,我们将其子节点的值加入结果中,然后递归处理其子树和右子树。 下面是 Python 代码实现: ``` python def sumOfLeftLeaves(root): def helper(node, is_left): if not node: return 0 if not node.left and not node.right and is_left: return node.val return helper(node.left, True) + helper(node.right, False) return helper(root, False) ``` 完整代码如下: ``` python class TreeNode: def __init__(self, val=0, left=None, right=None): self.val = val self.left = left self.right = right def buildTree(preorder): def helper(): val = preorder.pop(0) if val == '#': return None node = TreeNode(int(val)) node.left = helper() node.right = helper() return node return helper() def sumOfLeftLeaves(root): def helper(node, is_left): if not node: return 0 if not node.left and not node.right and is_left: return node.val return helper(node.left, True) + helper(node.right, False) return helper(root, False) preorder = '1(2(4(#)(#))(5(#)(#)))' root = buildTree(list(preorder)) print(sumOfLeftLeaves(root)) # 输出 4 ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值