字符串字符完成hash 整数数组用set完成hash
110.平衡二叉树
法1: 创建2个vector 并比较
int getNodeHight(TreeNode* node){
if (node == NULL) {
return 0;
}
int ans;
//后序遍历 返回以当前节点为根节点的高度,
// 返回-1则此二叉树不是平衡二叉树 左右中
int left_height = getNodeHight(node->left);
if(left_height == -1)return -1;
int right_height = getNodeHight(node->right);
if(right_height == -1)return -1;
return (abs(left_height - right_height) > 1) ? -1 : 1 + max(left_height,right_height);
}
bool isBalanced(TreeNode* root) {
//统计左右子树的高度
//leetcode的题目中都是以节点为一度,即根节点深度是1。
// 但维基百科上定义用边为一度,即根节点的深度是0
// 我们暂时以leetcode为准(毕竟要在这上面刷题)。
return getNodeHight(root) == -1 ? false : true;
}
257. 二叉树的所有路径
257. 二叉树的所有路径
法1:
/**
* 题目要求从根节点到叶子的路径,
* 所以需要前序遍历,
* 这样才方便让父节点指向孩子节点,找到对应的路径。
* @param node
* @param path 某条从根节点到叶子结点路径上的节点 val
* @param ans
*/
void traversal(TreeNode* node,vector<int>& path,vector<string>& ans){
path.push_back(node->val); //中
if (node->left == NULL && node->right == NULL){
string s_path;
int path_len = path.size();
for (int i = 0; i < path_len -1; ++i) {
s_path += to_string(path[i]);
s_path += "->";
}
s_path += to_string(path[path_len-1]);
ans.push_back(s_path);
return;
}
if (node->left){
traversal(node->left,path,ans);
path.pop_back();//回溯
}
if (node->right){
traversal(node->right,path,ans);
path.pop_back();//回溯
}
}
vector<string> binaryTreePaths(TreeNode* root) {
vector<int> path;
vector<string> ans;
if (root == NULL) return ans;
traversal(root,path,ans);
return ans;
}
404.左叶子之和
法1: 常规思路 数值裂解 求平方和 放入set 平方和在set中已经存在->no_happy 反之 happy
int sumOfLeftLeaves(TreeNode* root) {
if (root==NULL) return 0;
int leftValue = sumOfLeftLeaves(root->left);
if (root->left != NULL && root->left->left == NULL && root->left->right == NULL){
leftValue = root->left->val;
}
int rightValue = sumOfLeftLeaves(root->right);
int sum = leftValue +rightValue;
return sum;
}