【题目描述】
【代码思路】
这又是一个深度优先的例子,先解读一下题干,其实就是想从左至右的找到一颗树的所有叶结点,而遍历一棵树的所有结点,有深度优先和广度优先,这道题显然是深度优先更合适,因为广度优先是按层遍历的,不能保证从左至右找到所有叶结点,比如这道题广度优先找到的叶结点顺序就是[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;
}
};
个人拙见,欢迎交流!