二叉树相关问题-是否轴对称、路径总和、完美二叉树

①二叉树是否轴对称

/**

 * Definition for a binary tree node.

 * struct TreeNode {

 *     int val;

 *     TreeNode *left;

 *     TreeNode *right;

 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}

 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}

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

 * };

 */

class Solution {

public:

    bool isSymmetric(TreeNode* root) {

        return myfun(root,root);  

    }

private:

bool myfun(TreeNode* a,TreeNode* b)

{

    if(a==nullptr && b==nullptr)

    return true;

    if(a==nullptr || b==nullptr)

    return false;

    if(a->val == b->val && myfun(a->left,b->right) && myfun(b->left,a->right))

    return true;

    else return false;

}

};

②路径总和:给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum 。如果存在,返回 true ;否则,返回 false 。

class Solution {

public:

    bool hasPathSum(TreeNode* root, int targetSum) {

        if(root==nullptr)

        return false;

        if(root->left==nullptr && root->right==nullptr)  

        {

            if(root->val==targetSum)

            return true;

        }

        if(hasPathSum(root->left, targetSum-root->val) ||hasPathSum(root->right, targetSum-root->val) )

        {

            return true;

        }

        return false;

    }

};

③给你二叉树的根节点 root 和一个整数目标和 targetSum ,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。

class Solution {

public:

    vector<vector<int>> pathSum(TreeNode* root, int targetSum) {

        vector<vector<int>> result;//结果

        vector<int> a;//储存满足条件的路径

        myfun(root,targetSum,a,result);

        return result;

    }

private:

   void myfun (TreeNode* root, int targetSum,vector<int> &a,vector<vector<int>> &result)

   {

        if(root==nullptr)

        return;

        a.push_back(root->val);

        if(root->left==nullptr && root->right==nullptr)  

        {

            if(root->val==targetSum)

                result.push_back(a);

        }

        myfun(root->left, targetSum-root->val,a,result);

        myfun(root->right, targetSum-root->val,a,result);

        a.pop_back();  //到达该叶子结点发现不符合题意,清空该点

    }

};

给定一个 完美二叉树 ,其所有叶子节点都在同一层,每个父节点都有两个子节点。二叉树定义如下:

struct Node {
  int val;
  Node *left;
  Node *right;
  Node *next;
}

填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL

初始状态下,所有 next 指针都被设置为 NULL

/*

// Definition for a Node.

class Node {

public:

    int val;

    Node* left;

    Node* right;

    Node* next;

    Node() : val(0), left(NULL), right(NULL), next(NULL) {}

    Node(int _val) : val(_val), left(NULL), right(NULL), next(NULL) {}

    Node(int _val, Node* _left, Node* _right, Node* _next)

        : val(_val), left(_left), right(_right), next(_next) {}

};

*/

class Solution {

public:

    Node* connect(Node* root) {

        if(root==NULL)  

        return NULL;

        myfun(root->left,root->right);

        return root;

    }

private:

   void myfun(Node* a,Node* b)  //建立两个节点的连接

   {

    if(b==NULL)  //最右边的结点,即无它的右节点

    return ;

   a->next=b;  //让a节点的指针指向b

   //有三种指向:左/右子树内部自己指、左子树的最右指向右子树的最左

   myfun(a->left,a->right);

   myfun(b->left,b->right);  //顺序不能调

   myfun(a->right,b->left);

   }

};

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值