每日一道算法题--leetcode 872--叶子相似的树(深度优先)--C++

【题目描述】

【代码思路】

这又是一个深度优先的例子,先解读一下题干,其实就是想从左至右的找到一颗树的所有叶结点,而遍历一棵树的所有结点,有深度优先和广度优先,这道题显然是深度优先更合适,因为广度优先是按层遍历的,不能保证从左至右找到所有叶结点,比如这道题广度优先找到的叶结点顺序就是[6,9,8,7,4]这不符合题目要求,所以用深度优先。

这种递归的题目,首先要抓住一个点理清递归的函数内部逻辑,就拿结点5来说,我们想找5的从左至右的叶结点,那么应该先看遍历他的左子树,后遍历右子树,当然在开始左右子树的遍历之前,需要对结点5做出判断,5是否有左右子树,如果没有,说明5就是一个叶结点,需要放到一个字符串中,就是下面这句:

如果5结点有左子树,那么对左子树调用递归函数,同样先判断左子树的根结点是否为空,是否有左右子树,如果有,先对左子树递归,后对右子树递归。就是下面这句:


如果5结点有右子树,那么对右子树调用递归函数,就是下面这句:

最后返回一个字符串result,这里存着叶子结点从左至右的数值。这就是抓住一个点,理清递归函数内部逻辑。
最后在主调函数中,判断两颗树的result是否相同即可:

【源代码】

/**
 * 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:
    bool leafSimilar(TreeNode* root1, TreeNode* root2) {
        if(getleaf(root1)==getleaf(root2)){
            return true;
        }
        return false;
    }
    string getleaf(TreeNode* root){
        string result="";
        if(root==NULL) return result;
        if(root->left==NULL&&root->right==NULL) result+=to_string(root->val);
        if(root->left) result+=getleaf(root->left);
        if(root->right) result+=getleaf(root->right);
        return result;
    }
};

个人拙见,欢迎交流!

猜你喜欢

转载自blog.csdn.net/transformed/article/details/88688967