D15|leetcode 110、leetcode 257、leetcode 404

LeetCode 110. 平衡二叉树

题目:

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

思路:

采用后序遍历,从最下层的节点开始遍历,如果碰到某一个子二叉树不是平衡二叉树,那么与这个子二叉树相关的就都不是平衡二叉树。

代码:

/**

* 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:

    int getheight(TreeNode* pointer)

    {


        if(pointer==NULL) return 0;

        int leftnum=getheight(pointer->left);

        if(leftnum==-1) return -1;

        int rightnum=getheight(pointer->right);

        if(rightnum==-1) return -1;

        if(abs(rightnum-leftnum)>1) return -1;

        else {

          int res=1+max(leftnum,rightnum);

          return res;

        }


    }

    bool isBalanced(TreeNode* root) {

        int res=getheight(root);

        if(res!=-1)

        {

            return true;

        }else {

            return false;

        }

    }

};


LeetCode 257. 二叉树的所有路径

题目:

给你一个二叉树的根节点 root ,按 任意顺序 ,返回所有从根节点到叶子节点的路径。

思路:

这道题采用中序遍历的方式,因为每条路径上面都要有根节点,所以每次遍历到叶子节点之后要回溯到根节点,之后再遍历另外一条路。回溯的过程用pop来模拟,当递归遍历到叶子节点的时候,path此时就已经记录了路径,所以在递归返回的时候就可以依次弹出。

代码:

/**

* 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:

    void findall(TreeNode* cur, vector<int>& path, vector<string>& result)

    {

        path.push_back(cur->val);

        if(cur->left==NULL && cur->right==NULL)

        {

            string sPath;

            for (int i = 0; i < path.size() - 1; i++) {

                sPath += to_string(path[i]);

                sPath += "->";

            }

            sPath += to_string(path[path.size() - 1]);

            result.push_back(sPath);

            return;

        }

        if(cur->left!=NULL)

        {

            findall(cur->left,path,result);

            path.pop_back();

        }

        if(cur->right!=NULL)

        {

            findall(cur->right,path,result);

            path.pop_back();

        }


    }

    vector<string> binaryTreePaths(TreeNode* root) {

        vector<int> path;

        vector<string> result;

        if(root==NULL) return result;

        findall(root,path,result);

        return result;


    }

};


LeetCode 404. 左叶子之和

题目:

给定二叉树的根节点 root ,返回所有左叶子之和。

思路:

采用后序遍历,这道题的难点在于如何找到并判断是左叶子节点。左叶子节点一方面是叶子节点,另一方面是左节点,如果直接遍历到了叶子节点,想要判断是否为左节点就存在一定的困难,所以直接遍历到叶子节点的父节点即可,如果该节点的子节点的左右节点均为空,那么说明就是叶子节点,再返回该节点的左节点就得到了左叶子节点。

代码:

/**

* 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:

    int leftsum(TreeNode* pointer)

    {

        if(pointer==NULL)return 0;


        int leftnum=leftsum(pointer->left);

        if(pointer->left!=NULL&&pointer->left->left==NULL&&pointer->left->right==NULL)

        {

            leftnum= pointer->left->val;

        }

        int rightnum=leftsum(pointer->right);

        int sum=leftnum+rightnum;

        return sum;

    }

    int sumOfLeftLeaves(TreeNode* root) {

        return leftsum(root);

    }

};

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容